diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-12-02 17:35:04 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-12-02 17:35:04 -0800 | 
| commit | 76bb8b05960c3d1668e6bee7624ed886cbd135ba (patch) | |
| tree | dec8cc723bff2e556e39c05333235cca74b87f29 /drivers/video | |
| parent | e30dbe50dc91d25dde251169b66d39f99bf45bad (diff) | |
| parent | d21b7e6b985c15ff75e8668b0282ec5104391901 (diff) | |
| download | linux-76bb8b05960c3d1668e6bee7624ed886cbd135ba.tar.bz2 | |
Merge tag 'kbuild-v5.5' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild
Pull Kbuild updates from Masahiro Yamada:
 - remove unneeded asm headers from hexagon, ia64
 - add 'dir-pkg' target, which works like 'tar-pkg' but skips archiving
 - add 'helpnewconfig' target, which shows help for new CONFIG options
 - support 'make nsdeps' for external modules
 - make rebuilds faster by deleting $(wildcard $^) checks
 - remove compile tests for kernel-space headers
 - refactor modpost to simplify modversion handling
 - make single target builds faster
 - optimize and clean up scripts/kallsyms.c
 - refactor various Makefiles and scripts
* tag 'kbuild-v5.5' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (59 commits)
  MAINTAINERS: update Kbuild/Kconfig maintainer's email address
  scripts/kallsyms: remove redundant initializers
  scripts/kallsyms: put check_symbol_range() calls close together
  scripts/kallsyms: make check_symbol_range() void function
  scripts/kallsyms: move ignored symbol types to is_ignored_symbol()
  scripts/kallsyms: move more patterns to the ignored_prefixes array
  scripts/kallsyms: skip ignored symbols very early
  scripts/kallsyms: add const qualifiers where possible
  scripts/kallsyms: make find_token() return (unsigned char *)
  scripts/kallsyms: replace prefix_underscores_count() with strspn()
  scripts/kallsyms: add sym_name() to mitigate cast ugliness
  scripts/kallsyms: remove unneeded length check for prefix matching
  scripts/kallsyms: remove redundant is_arm_mapping_symbol()
  scripts/kallsyms: set relative_base more effectively
  scripts/kallsyms: shrink table before sorting it
  scripts/kallsyms: fix definitely-lost memory leak
  scripts/kallsyms: remove unneeded #ifndef ARRAY_SIZE
  kbuild: make single target builds even faster
  modpost: respect the previous export when 'exported twice' is warned
  modpost: do not set ->preloaded for symbols from Module.symvers
  ...
Diffstat (limited to 'drivers/video')
| -rw-r--r-- | drivers/video/logo/.gitignore | 1 | ||||
| -rw-r--r-- | drivers/video/logo/Makefile | 15 | ||||
| -rw-r--r-- | drivers/video/logo/pnmtologo.c | 514 | 
3 files changed, 520 insertions, 10 deletions
| diff --git a/drivers/video/logo/.gitignore b/drivers/video/logo/.gitignore index e48355f538fa..9dda1b26b2e4 100644 --- a/drivers/video/logo/.gitignore +++ b/drivers/video/logo/.gitignore @@ -5,3 +5,4 @@  *_vga16.c  *_clut224.c  *_gray256.c +pnmtologo diff --git a/drivers/video/logo/Makefile b/drivers/video/logo/Makefile index 16f60c1e1766..bcda657493a4 100644 --- a/drivers/video/logo/Makefile +++ b/drivers/video/logo/Makefile @@ -18,24 +18,19 @@ obj-$(CONFIG_SPU_BASE)			+= logo_spe_clut224.o  # How to generate logo's -pnmtologo := scripts/pnmtologo +hostprogs-y := pnmtologo  # Create commands like "pnmtologo -t mono -n logo_mac_mono -o ..."  quiet_cmd_logo = LOGO    $@ -	cmd_logo = $(pnmtologo) \ -			-t $(patsubst $*_%,%,$(notdir $(basename $<))) \ -			-n $(notdir $(basename $<)) -o $@ $< +      cmd_logo = $(obj)/pnmtologo -t $(lastword $(subst _, ,$*)) -n $* -o $@ $< -$(obj)/%_mono.c: $(src)/%_mono.pbm $(pnmtologo) FORCE +$(obj)/%.c: $(src)/%.pbm $(obj)/pnmtologo FORCE  	$(call if_changed,logo) -$(obj)/%_vga16.c: $(src)/%_vga16.ppm $(pnmtologo) FORCE +$(obj)/%.c: $(src)/%.ppm $(obj)/pnmtologo FORCE  	$(call if_changed,logo) -$(obj)/%_clut224.c: $(src)/%_clut224.ppm $(pnmtologo) FORCE -	$(call if_changed,logo) - -$(obj)/%_gray256.c: $(src)/%_gray256.pgm $(pnmtologo) FORCE +$(obj)/%.c: $(src)/%.pgm $(obj)/pnmtologo FORCE  	$(call if_changed,logo)  # generated C files diff --git a/drivers/video/logo/pnmtologo.c b/drivers/video/logo/pnmtologo.c new file mode 100644 index 000000000000..4718d7895f0b --- /dev/null +++ b/drivers/video/logo/pnmtologo.c @@ -0,0 +1,514 @@ + +/* + *  Convert a logo in ASCII PNM format to C source suitable for inclusion in + *  the Linux kernel + * + *  (C) Copyright 2001-2003 by Geert Uytterhoeven <geert@linux-m68k.org> + * + *  -------------------------------------------------------------------------- + * + *  This file is subject to the terms and conditions of the GNU General Public + *  License. See the file COPYING in the main directory of the Linux + *  distribution for more details. + */ + +#include <ctype.h> +#include <errno.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + + +static const char *programname; +static const char *filename; +static const char *logoname = "linux_logo"; +static const char *outputname; +static FILE *out; + + +#define LINUX_LOGO_MONO		1	/* monochrome black/white */ +#define LINUX_LOGO_VGA16	2	/* 16 colors VGA text palette */ +#define LINUX_LOGO_CLUT224	3	/* 224 colors */ +#define LINUX_LOGO_GRAY256	4	/* 256 levels grayscale */ + +static const char *logo_types[LINUX_LOGO_GRAY256+1] = { +    [LINUX_LOGO_MONO] = "LINUX_LOGO_MONO", +    [LINUX_LOGO_VGA16] = "LINUX_LOGO_VGA16", +    [LINUX_LOGO_CLUT224] = "LINUX_LOGO_CLUT224", +    [LINUX_LOGO_GRAY256] = "LINUX_LOGO_GRAY256" +}; + +#define MAX_LINUX_LOGO_COLORS	224 + +struct color { +    unsigned char red; +    unsigned char green; +    unsigned char blue; +}; + +static const struct color clut_vga16[16] = { +    { 0x00, 0x00, 0x00 }, +    { 0x00, 0x00, 0xaa }, +    { 0x00, 0xaa, 0x00 }, +    { 0x00, 0xaa, 0xaa }, +    { 0xaa, 0x00, 0x00 }, +    { 0xaa, 0x00, 0xaa }, +    { 0xaa, 0x55, 0x00 }, +    { 0xaa, 0xaa, 0xaa }, +    { 0x55, 0x55, 0x55 }, +    { 0x55, 0x55, 0xff }, +    { 0x55, 0xff, 0x55 }, +    { 0x55, 0xff, 0xff }, +    { 0xff, 0x55, 0x55 }, +    { 0xff, 0x55, 0xff }, +    { 0xff, 0xff, 0x55 }, +    { 0xff, 0xff, 0xff }, +}; + + +static int logo_type = LINUX_LOGO_CLUT224; +static unsigned int logo_width; +static unsigned int logo_height; +static struct color **logo_data; +static struct color logo_clut[MAX_LINUX_LOGO_COLORS]; +static unsigned int logo_clutsize; +static int is_plain_pbm = 0; + +static void die(const char *fmt, ...) +    __attribute__ ((noreturn)) __attribute ((format (printf, 1, 2))); +static void usage(void) __attribute ((noreturn)); + + +static unsigned int get_number(FILE *fp) +{ +    int c, val; + +    /* Skip leading whitespace */ +    do { +	c = fgetc(fp); +	if (c == EOF) +	    die("%s: end of file\n", filename); +	if (c == '#') { +	    /* Ignore comments 'till end of line */ +	    do { +		c = fgetc(fp); +		if (c == EOF) +		    die("%s: end of file\n", filename); +	    } while (c != '\n'); +	} +    } while (isspace(c)); + +    /* Parse decimal number */ +    val = 0; +    while (isdigit(c)) { +	val = 10*val+c-'0'; +	/* some PBM are 'broken'; GiMP for example exports a PBM without space +	 * between the digits. This is Ok cause we know a PBM can only have a '1' +	 * or a '0' for the digit. */ +	if (is_plain_pbm) +		break; +	c = fgetc(fp); +	if (c == EOF) +	    die("%s: end of file\n", filename); +    } +    return val; +} + +static unsigned int get_number255(FILE *fp, unsigned int maxval) +{ +    unsigned int val = get_number(fp); +    return (255*val+maxval/2)/maxval; +} + +static void read_image(void) +{ +    FILE *fp; +    unsigned int i, j; +    int magic; +    unsigned int maxval; + +    /* open image file */ +    fp = fopen(filename, "r"); +    if (!fp) +	die("Cannot open file %s: %s\n", filename, strerror(errno)); + +    /* check file type and read file header */ +    magic = fgetc(fp); +    if (magic != 'P') +	die("%s is not a PNM file\n", filename); +    magic = fgetc(fp); +    switch (magic) { +	case '1': +	case '2': +	case '3': +	    /* Plain PBM/PGM/PPM */ +	    break; + +	case '4': +	case '5': +	case '6': +	    /* Binary PBM/PGM/PPM */ +	    die("%s: Binary PNM is not supported\n" +		"Use pnmnoraw(1) to convert it to ASCII PNM\n", filename); + +	default: +	    die("%s is not a PNM file\n", filename); +    } +    logo_width = get_number(fp); +    logo_height = get_number(fp); + +    /* allocate image data */ +    logo_data = (struct color **)malloc(logo_height*sizeof(struct color *)); +    if (!logo_data) +	die("%s\n", strerror(errno)); +    for (i = 0; i < logo_height; i++) { +	logo_data[i] = malloc(logo_width*sizeof(struct color)); +	if (!logo_data[i]) +	    die("%s\n", strerror(errno)); +    } + +    /* read image data */ +    switch (magic) { +	case '1': +	    /* Plain PBM */ +	    is_plain_pbm = 1; +	    for (i = 0; i < logo_height; i++) +		for (j = 0; j < logo_width; j++) +		    logo_data[i][j].red = logo_data[i][j].green = +			logo_data[i][j].blue = 255*(1-get_number(fp)); +	    break; + +	case '2': +	    /* Plain PGM */ +	    maxval = get_number(fp); +	    for (i = 0; i < logo_height; i++) +		for (j = 0; j < logo_width; j++) +		    logo_data[i][j].red = logo_data[i][j].green = +			logo_data[i][j].blue = get_number255(fp, maxval); +	    break; + +	case '3': +	    /* Plain PPM */ +	    maxval = get_number(fp); +	    for (i = 0; i < logo_height; i++) +		for (j = 0; j < logo_width; j++) { +		    logo_data[i][j].red = get_number255(fp, maxval); +		    logo_data[i][j].green = get_number255(fp, maxval); +		    logo_data[i][j].blue = get_number255(fp, maxval); +		} +	    break; +    } + +    /* close file */ +    fclose(fp); +} + +static inline int is_black(struct color c) +{ +    return c.red == 0 && c.green == 0 && c.blue == 0; +} + +static inline int is_white(struct color c) +{ +    return c.red == 255 && c.green == 255 && c.blue == 255; +} + +static inline int is_gray(struct color c) +{ +    return c.red == c.green && c.red == c.blue; +} + +static inline int is_equal(struct color c1, struct color c2) +{ +    return c1.red == c2.red && c1.green == c2.green && c1.blue == c2.blue; +} + +static void write_header(void) +{ +    /* open logo file */ +    if (outputname) { +	out = fopen(outputname, "w"); +	if (!out) +	    die("Cannot create file %s: %s\n", outputname, strerror(errno)); +    } else { +	out = stdout; +    } + +    fputs("/*\n", out); +    fputs(" *  DO NOT EDIT THIS FILE!\n", out); +    fputs(" *\n", out); +    fprintf(out, " *  It was automatically generated from %s\n", filename); +    fputs(" *\n", out); +    fprintf(out, " *  Linux logo %s\n", logoname); +    fputs(" */\n\n", out); +    fputs("#include <linux/linux_logo.h>\n\n", out); +    fprintf(out, "static unsigned char %s_data[] __initdata = {\n", +	    logoname); +} + +static void write_footer(void) +{ +    fputs("\n};\n\n", out); +    fprintf(out, "const struct linux_logo %s __initconst = {\n", logoname); +    fprintf(out, "\t.type\t\t= %s,\n", logo_types[logo_type]); +    fprintf(out, "\t.width\t\t= %d,\n", logo_width); +    fprintf(out, "\t.height\t\t= %d,\n", logo_height); +    if (logo_type == LINUX_LOGO_CLUT224) { +	fprintf(out, "\t.clutsize\t= %d,\n", logo_clutsize); +	fprintf(out, "\t.clut\t\t= %s_clut,\n", logoname); +    } +    fprintf(out, "\t.data\t\t= %s_data\n", logoname); +    fputs("};\n\n", out); + +    /* close logo file */ +    if (outputname) +	fclose(out); +} + +static int write_hex_cnt; + +static void write_hex(unsigned char byte) +{ +    if (write_hex_cnt % 12) +	fprintf(out, ", 0x%02x", byte); +    else if (write_hex_cnt) +	fprintf(out, ",\n\t0x%02x", byte); +    else +	fprintf(out, "\t0x%02x", byte); +    write_hex_cnt++; +} + +static void write_logo_mono(void) +{ +    unsigned int i, j; +    unsigned char val, bit; + +    /* validate image */ +    for (i = 0; i < logo_height; i++) +	for (j = 0; j < logo_width; j++) +	    if (!is_black(logo_data[i][j]) && !is_white(logo_data[i][j])) +		die("Image must be monochrome\n"); + +    /* write file header */ +    write_header(); + +    /* write logo data */ +    for (i = 0; i < logo_height; i++) { +	for (j = 0; j < logo_width;) { +	    for (val = 0, bit = 0x80; bit && j < logo_width; j++, bit >>= 1) +		if (logo_data[i][j].red) +		    val |= bit; +	    write_hex(val); +	} +    } + +    /* write logo structure and file footer */ +    write_footer(); +} + +static void write_logo_vga16(void) +{ +    unsigned int i, j, k; +    unsigned char val; + +    /* validate image */ +    for (i = 0; i < logo_height; i++) +	for (j = 0; j < logo_width; j++) { +	    for (k = 0; k < 16; k++) +		if (is_equal(logo_data[i][j], clut_vga16[k])) +		    break; +	    if (k == 16) +		die("Image must use the 16 console colors only\n" +		    "Use ppmquant(1) -map clut_vga16.ppm to reduce the number " +		    "of colors\n"); +	} + +    /* write file header */ +    write_header(); + +    /* write logo data */ +    for (i = 0; i < logo_height; i++) +	for (j = 0; j < logo_width; j++) { +	    for (k = 0; k < 16; k++) +		if (is_equal(logo_data[i][j], clut_vga16[k])) +		    break; +	    val = k<<4; +	    if (++j < logo_width) { +		for (k = 0; k < 16; k++) +		    if (is_equal(logo_data[i][j], clut_vga16[k])) +			break; +		val |= k; +	    } +	    write_hex(val); +	} + +    /* write logo structure and file footer */ +    write_footer(); +} + +static void write_logo_clut224(void) +{ +    unsigned int i, j, k; + +    /* validate image */ +    for (i = 0; i < logo_height; i++) +	for (j = 0; j < logo_width; j++) { +	    for (k = 0; k < logo_clutsize; k++) +		if (is_equal(logo_data[i][j], logo_clut[k])) +		    break; +	    if (k == logo_clutsize) { +		if (logo_clutsize == MAX_LINUX_LOGO_COLORS) +		    die("Image has more than %d colors\n" +			"Use ppmquant(1) to reduce the number of colors\n", +			MAX_LINUX_LOGO_COLORS); +		logo_clut[logo_clutsize++] = logo_data[i][j]; +	    } +	} + +    /* write file header */ +    write_header(); + +    /* write logo data */ +    for (i = 0; i < logo_height; i++) +	for (j = 0; j < logo_width; j++) { +	    for (k = 0; k < logo_clutsize; k++) +		if (is_equal(logo_data[i][j], logo_clut[k])) +		    break; +	    write_hex(k+32); +	} +    fputs("\n};\n\n", out); + +    /* write logo clut */ +    fprintf(out, "static unsigned char %s_clut[] __initdata = {\n", +	    logoname); +    write_hex_cnt = 0; +    for (i = 0; i < logo_clutsize; i++) { +	write_hex(logo_clut[i].red); +	write_hex(logo_clut[i].green); +	write_hex(logo_clut[i].blue); +    } + +    /* write logo structure and file footer */ +    write_footer(); +} + +static void write_logo_gray256(void) +{ +    unsigned int i, j; + +    /* validate image */ +    for (i = 0; i < logo_height; i++) +	for (j = 0; j < logo_width; j++) +	    if (!is_gray(logo_data[i][j])) +		die("Image must be grayscale\n"); + +    /* write file header */ +    write_header(); + +    /* write logo data */ +    for (i = 0; i < logo_height; i++) +	for (j = 0; j < logo_width; j++) +	    write_hex(logo_data[i][j].red); + +    /* write logo structure and file footer */ +    write_footer(); +} + +static void die(const char *fmt, ...) +{ +    va_list ap; + +    va_start(ap, fmt); +    vfprintf(stderr, fmt, ap); +    va_end(ap); + +    exit(1); +} + +static void usage(void) +{ +    die("\n" +	"Usage: %s [options] <filename>\n" +	"\n" +	"Valid options:\n" +	"    -h          : display this usage information\n" +	"    -n <name>   : specify logo name (default: linux_logo)\n" +	"    -o <output> : output to file <output> instead of stdout\n" +	"    -t <type>   : specify logo type, one of\n" +	"                      mono    : monochrome black/white\n" +	"                      vga16   : 16 colors VGA text palette\n" +	"                      clut224 : 224 colors (default)\n" +	"                      gray256 : 256 levels grayscale\n" +	"\n", programname); +} + +int main(int argc, char *argv[]) +{ +    int opt; + +    programname = argv[0]; + +    opterr = 0; +    while (1) { +	opt = getopt(argc, argv, "hn:o:t:"); +	if (opt == -1) +	    break; + +	switch (opt) { +	    case 'h': +		usage(); +		break; + +	    case 'n': +		logoname = optarg; +		break; + +	    case 'o': +		outputname = optarg; +		break; + +	    case 't': +		if (!strcmp(optarg, "mono")) +		    logo_type = LINUX_LOGO_MONO; +		else if (!strcmp(optarg, "vga16")) +		    logo_type = LINUX_LOGO_VGA16; +		else if (!strcmp(optarg, "clut224")) +		    logo_type = LINUX_LOGO_CLUT224; +		else if (!strcmp(optarg, "gray256")) +		    logo_type = LINUX_LOGO_GRAY256; +		else +		    usage(); +		break; + +	    default: +		usage(); +		break; +	} +    } +    if (optind != argc-1) +	usage(); + +    filename = argv[optind]; + +    read_image(); +    switch (logo_type) { +	case LINUX_LOGO_MONO: +	    write_logo_mono(); +	    break; + +	case LINUX_LOGO_VGA16: +	    write_logo_vga16(); +	    break; + +	case LINUX_LOGO_CLUT224: +	    write_logo_clut224(); +	    break; + +	case LINUX_LOGO_GRAY256: +	    write_logo_gray256(); +	    break; +    } +    exit(0); +} |