drm/nouveau/bios: store a type/mask hash in parsed dcb data
authorBen Skeggs <bskeggs@redhat.com>
Sat, 16 Feb 2013 02:01:59 +0000 (12:01 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 20 Feb 2013 06:00:59 +0000 (16:00 +1000)
Matches format used by a couple of other vbios tables, useful
to have laying around already calculated.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/include/subdev/bios/dcb.h
drivers/gpu/drm/nouveau/core/subdev/bios/dcb.c

index 9e54678a17289354c0027c171d1a7bb314d048ed..123270e9813a86c896d4a7d452c545eeb8ae87be 100644 (file)
@@ -16,6 +16,8 @@ enum dcb_output_type {
 
 struct dcb_output {
        int index;      /* may not be raw dcb index if merging has happened */
+       u16 hasht;
+       u16 hashm;
        enum dcb_output_type type;
        uint8_t i2c_index;
        uint8_t heads;
index 73a29da0415f36db732be3a682154d1b5fee18b5..2d9b9d7a7992111cc1d4bd0ff3e60254bf52dcb5 100644 (file)
@@ -107,6 +107,18 @@ dcb_outp(struct nouveau_bios *bios, u8 idx, u8 *ver, u8 *len)
        return 0x0000;
 }
 
+static inline u16
+dcb_outp_hasht(struct dcb_output *outp)
+{
+       return (outp->extdev << 8) | (outp->location << 4) | outp->type;
+}
+
+static inline u16
+dcb_outp_hashm(struct dcb_output *outp)
+{
+       return (outp->heads << 8) | (outp->link << 6) | outp->or;
+}
+
 u16
 dcb_outp_parse(struct nouveau_bios *bios, u8 idx, u8 *ver, u8 *len,
               struct dcb_output *outp)
@@ -143,29 +155,20 @@ dcb_outp_parse(struct nouveau_bios *bios, u8 idx, u8 *ver, u8 *len,
                                break;
                        }
                }
+
+               outp->hasht = dcb_outp_hasht(outp);
+               outp->hashm = dcb_outp_hashm(outp);
        }
        return dcb;
 }
 
-static inline u16
-dcb_outp_hasht(struct dcb_output *outp)
-{
-       return (outp->location << 4) | outp->type;
-}
-
-static inline u16
-dcb_outp_hashm(struct dcb_output *outp)
-{
-       return (outp->heads << 8) | (outp->link << 6) | outp->or;
-}
-
 u16
 dcb_outp_match(struct nouveau_bios *bios, u16 type, u16 mask,
               u8 *ver, u8 *len, struct dcb_output *outp)
 {
        u16 dcb, idx = 0;
        while ((dcb = dcb_outp_parse(bios, idx++, ver, len, outp))) {
-               if (dcb_outp_hasht(outp) == type) {
+               if ((dcb_outp_hasht(outp) & 0x00ff) == (type & 0x00ff)) {
                        if ((dcb_outp_hashm(outp) & mask) == mask)
                                break;
                }