Message ID | 20220720142732.32041-10-tzimmermann@suse.de |
---|---|
State | Superseded |
Headers | show |
Series | drm: Add driver for PowerPC OF displays | expand |
On 7/20/22 16:27, Thomas Zimmermann wrote: > Add a per-model device-function structure in preparation of adding > color-management support. Detection of the individual models has been > taken from fbdev's offb. > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > --- Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> [...] > +static bool is_avivo(__be32 vendor, __be32 device) > +{ > + /* This will match most R5xx */ > + return (vendor == 0x1002) && > + ((device >= 0x7100 && device < 0x7800) || (device >= 0x9400)); > +} Maybe add some constant macros to not have these magic numbers ?
Hello, On Tue, Jul 26, 2022 at 03:38:37PM +0200, Javier Martinez Canillas wrote: > On 7/20/22 16:27, Thomas Zimmermann wrote: > > Add a per-model device-function structure in preparation of adding > > color-management support. Detection of the individual models has been > > taken from fbdev's offb. > > > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > > --- > > Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> > > [...] > > > +static bool is_avivo(__be32 vendor, __be32 device) > > +{ > > + /* This will match most R5xx */ > > + return (vendor == 0x1002) && > > + ((device >= 0x7100 && device < 0x7800) || (device >= 0x9400)); > > +} > > Maybe add some constant macros to not have these magic numbers ? This is based on the existing fbdev implementation's magic numbers: drivers/video/fbdev/offb.c: ((*did >= 0x7100 && *did < 0x7800) || Of course, it would be great if somebody knowledgeable could clarify those. Thanks Michal
Hello Michal, On 7/26/22 16:40, Michal Suchánek wrote: > Hello, > > On Tue, Jul 26, 2022 at 03:38:37PM +0200, Javier Martinez Canillas wrote: >> On 7/20/22 16:27, Thomas Zimmermann wrote: >>> Add a per-model device-function structure in preparation of adding >>> color-management support. Detection of the individual models has been >>> taken from fbdev's offb. >>> >>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> >>> --- >> >> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> >> >> [...] >> >>> +static bool is_avivo(__be32 vendor, __be32 device) >>> +{ >>> + /* This will match most R5xx */ >>> + return (vendor == 0x1002) && >>> + ((device >= 0x7100 && device < 0x7800) || (device >= 0x9400)); >>> +} >> >> Maybe add some constant macros to not have these magic numbers ? > > This is based on the existing fbdev implementation's magic numbers: > > drivers/video/fbdev/offb.c: ((*did >= 0x7100 && *did < 0x7800) || > Ah, I see. Then we might have to go with the magic numbers... > Of course, it would be great if somebody knowledgeable could clarify > those. > Indeed.
Hi Am 26.07.22 um 21:22 schrieb Javier Martinez Canillas: > Hello Michal, > > On 7/26/22 16:40, Michal Suchánek wrote: >> Hello, >> >> On Tue, Jul 26, 2022 at 03:38:37PM +0200, Javier Martinez Canillas wrote: >>> On 7/20/22 16:27, Thomas Zimmermann wrote: >>>> Add a per-model device-function structure in preparation of adding >>>> color-management support. Detection of the individual models has been >>>> taken from fbdev's offb. >>>> >>>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> >>>> --- >>> >>> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> >>> >>> [...] >>> >>>> +static bool is_avivo(__be32 vendor, __be32 device) >>>> +{ >>>> + /* This will match most R5xx */ >>>> + return (vendor == 0x1002) && >>>> + ((device >= 0x7100 && device < 0x7800) || (device >= 0x9400)); >>>> +} >>> >>> Maybe add some constant macros to not have these magic numbers ? >> >> This is based on the existing fbdev implementation's magic numbers: >> >> drivers/video/fbdev/offb.c: ((*did >= 0x7100 && *did < 0x7800) || >> > > Ah, I see. Then we might have to go with the magic numbers... > >> Of course, it would be great if somebody knowledgeable could clarify >> those. Those are PCI ids. If I find them already defined, I'll use the macros instead. Best regards Thomas >> > > Indeed. >
On Tue, 2022-07-26 at 16:40 +0200, Michal Suchánek wrote: > Hello, > > On Tue, Jul 26, 2022 at 03:38:37PM +0200, Javier Martinez Canillas wrote: > > On 7/20/22 16:27, Thomas Zimmermann wrote: > > > Add a per-model device-function structure in preparation of adding > > > color-management support. Detection of the individual models has been > > > taken from fbdev's offb. > > > > > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > > > --- > > > > Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> > > > > [...] > > > > > +static bool is_avivo(__be32 vendor, __be32 device) > > > +{ > > > + /* This will match most R5xx */ > > > + return (vendor == 0x1002) && > > > + ((device >= 0x7100 && device < 0x7800) || (device >= 0x9400)); > > > +} > > > > Maybe add some constant macros to not have these magic numbers ? > > This is based on the existing fbdev implementation's magic numbers: > > drivers/video/fbdev/offb.c: ((*did >= 0x7100 && *did < 0x7800) || > > Of course, it would be great if somebody knowledgeable could clarify > those. I don't think anybody remembers :-) Vendor 0x1002 is PCI_VENDOR_ID_ATI, but the rest is basically ranges of PCI IDs for which we don't have symbolic constants. Cheers, Ben.
Hi Am 05.08.22 um 02:22 schrieb Benjamin Herrenschmidt: > On Tue, 2022-07-26 at 16:40 +0200, Michal Suchánek wrote: >> Hello, >> >> On Tue, Jul 26, 2022 at 03:38:37PM +0200, Javier Martinez Canillas wrote: >>> On 7/20/22 16:27, Thomas Zimmermann wrote: >>>> Add a per-model device-function structure in preparation of adding >>>> color-management support. Detection of the individual models has been >>>> taken from fbdev's offb. >>>> >>>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> >>>> --- >>> >>> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> >>> >>> [...] >>> >>>> +static bool is_avivo(__be32 vendor, __be32 device) >>>> +{ >>>> + /* This will match most R5xx */ >>>> + return (vendor == 0x1002) && >>>> + ((device >= 0x7100 && device < 0x7800) || (device >= 0x9400)); >>>> +} >>> >>> Maybe add some constant macros to not have these magic numbers ? >> >> This is based on the existing fbdev implementation's magic numbers: >> >> drivers/video/fbdev/offb.c: ((*did >= 0x7100 && *did < 0x7800) || >> >> Of course, it would be great if somebody knowledgeable could clarify >> those. > > I don't think anybody remembers :-) Vendor 0x1002 is PCI_VENDOR_ID_ATI, I do :) > but the rest is basically ranges of PCI IDs for which we don't have > symbolic constants. Should we add them to the official list in pci_ids.h? I cannot find 0x7800. The others are R520 and R600. Best regards Thomas > > Cheers, > Ben. >
diff --git a/drivers/gpu/drm/tiny/ofdrm.c b/drivers/gpu/drm/tiny/ofdrm.c index ad673c9b5502..62136b8ab975 100644 --- a/drivers/gpu/drm/tiny/ofdrm.c +++ b/drivers/gpu/drm/tiny/ofdrm.c @@ -29,6 +29,18 @@ #define DRIVER_MAJOR 1 #define DRIVER_MINOR 0 +enum ofdrm_model { + OFDRM_MODEL_UNKNOWN, + OFDRM_MODEL_MACH64, /* ATI Mach64 */ + OFDRM_MODEL_RAGE128, /* ATI Rage128 */ + OFDRM_MODEL_RAGE_M3A, /* ATI Rage Mobility M3 Head A */ + OFDRM_MODEL_RAGE_M3B, /* ATI Rage Mobility M3 Head B */ + OFDRM_MODEL_RADEON, /* ATI Radeon */ + OFDRM_MODEL_GXT2000, /* IBM GXT2000 */ + OFDRM_MODEL_AVIVO, /* ATI R5xx */ + OFDRM_MODEL_QEMU, /* QEMU VGA */ +}; + /* * Helpers for display nodes */ @@ -150,14 +162,62 @@ static u64 display_get_address_of(struct drm_device *dev, struct device_node *of return address; } +static bool is_avivo(__be32 vendor, __be32 device) +{ + /* This will match most R5xx */ + return (vendor == 0x1002) && + ((device >= 0x7100 && device < 0x7800) || (device >= 0x9400)); +} + +static enum ofdrm_model display_get_model_of(struct drm_device *dev, struct device_node *of_node) +{ + enum ofdrm_model model = OFDRM_MODEL_UNKNOWN; + + if (of_node_name_prefix(of_node, "ATY,Rage128")) { + model = OFDRM_MODEL_RAGE128; + } else if (of_node_name_prefix(of_node, "ATY,RageM3pA") || + of_node_name_prefix(of_node, "ATY,RageM3p12A")) { + model = OFDRM_MODEL_RAGE_M3A; + } else if (of_node_name_prefix(of_node, "ATY,RageM3pB")) { + model = OFDRM_MODEL_RAGE_M3B; + } else if (of_node_name_prefix(of_node, "ATY,Rage6")) { + model = OFDRM_MODEL_RADEON; + } else if (of_node_name_prefix(of_node, "ATY,")) { + return OFDRM_MODEL_MACH64; + } else if (of_device_is_compatible(of_node, "pci1014,b7") || + of_device_is_compatible(of_node, "pci1014,21c")) { + model = OFDRM_MODEL_GXT2000; + } else if (of_node_name_prefix(of_node, "vga,Display-")) { + struct device_node *of_parent; + const __be32 *vendor_p, *device_p; + + /* Look for AVIVO initialized by SLOF */ + of_parent = of_get_parent(of_node); + vendor_p = of_get_property(of_parent, "vendor-id", NULL); + device_p = of_get_property(of_parent, "device-id", NULL); + if (vendor_p && device_p && is_avivo(*vendor_p, *device_p)) + model = OFDRM_MODEL_AVIVO; + of_node_put(of_parent); + } else if (of_device_is_compatible(of_node, "qemu,std-vga")) { + model = OFDRM_MODEL_QEMU; + } + + return model; +} + /* * Open Firmware display device */ +struct ofdrm_device_funcs { +}; + struct ofdrm_device { struct drm_device dev; struct platform_device *pdev; + const struct ofdrm_device_funcs *funcs; + /* firmware framebuffer */ struct drm_fwfb fwfb; @@ -489,12 +549,40 @@ static const struct drm_mode_config_funcs ofdrm_mode_config_funcs = { * Init / Cleanup */ +static const struct ofdrm_device_funcs ofdrm_unknown_device_funcs = { +}; + +static const struct ofdrm_device_funcs ofdrm_mach64_device_funcs = { +}; + +static const struct ofdrm_device_funcs ofdrm_rage128_device_funcs = { +}; + +static const struct ofdrm_device_funcs ofdrm_rage_m3a_device_funcs = { +}; + +static const struct ofdrm_device_funcs ofdrm_rage_m3b_device_funcs = { +}; + +static const struct ofdrm_device_funcs ofdrm_radeon_device_funcs = { +}; + +static const struct ofdrm_device_funcs ofdrm_gxt2000_device_funcs = { +}; + +static const struct ofdrm_device_funcs ofdrm_avivo_device_funcs = { +}; + +static const struct ofdrm_device_funcs ofdrm_qemu_device_funcs = { +}; + static struct ofdrm_device *ofdrm_device_create(struct drm_driver *drv, struct platform_device *pdev) { struct device_node *of_node = pdev->dev.of_node; struct ofdrm_device *odev; struct drm_device *dev; + enum ofdrm_model model; int width, height, linebytes; const struct drm_format_info *format; u64 address; @@ -525,6 +613,39 @@ static struct ofdrm_device *ofdrm_device_create(struct drm_driver *drv, * OF display-node settings */ + model = display_get_model_of(dev, of_node); + drm_dbg(dev, "detected model %d\n", model); + + switch (model) { + case OFDRM_MODEL_UNKNOWN: + odev->funcs = &ofdrm_unknown_device_funcs; + break; + case OFDRM_MODEL_MACH64: + odev->funcs = &ofdrm_mach64_device_funcs; + break; + case OFDRM_MODEL_RAGE128: + odev->funcs = &ofdrm_rage128_device_funcs; + break; + case OFDRM_MODEL_RAGE_M3A: + odev->funcs = &ofdrm_rage_m3a_device_funcs; + break; + case OFDRM_MODEL_RAGE_M3B: + odev->funcs = &ofdrm_rage_m3b_device_funcs; + break; + case OFDRM_MODEL_RADEON: + odev->funcs = &ofdrm_radeon_device_funcs; + break; + case OFDRM_MODEL_GXT2000: + odev->funcs = &ofdrm_gxt2000_device_funcs; + break; + case OFDRM_MODEL_AVIVO: + odev->funcs = &ofdrm_avivo_device_funcs; + break; + case OFDRM_MODEL_QEMU: + odev->funcs = &ofdrm_qemu_device_funcs; + break; + } + width = display_get_width_of(dev, of_node); if (width < 0) return ERR_PTR(width);
Add a per-model device-function structure in preparation of adding color-management support. Detection of the individual models has been taken from fbdev's offb. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> --- drivers/gpu/drm/tiny/ofdrm.c | 121 +++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+)