Re: [Nouveau] [PATCH 5/6] drm: Delete "mandatory" stereographic modes

2017-01-18 Thread Damien Lespiau
On Wed, Jan 18, 2017 at 12:10:56AM -0500, Ilia Mirkin wrote:
> On Tue, Jan 17, 2017 at 5:42 PM, Alastair Bridgewater
>  wrote:
> > HDMI specification 1.4a, table 8-15 is very explicitly a "must
> > support at least one of" table, not a "must support all of" table.
> > It is not hard to find hardware that does not support some of the
> > so-called "mandatory" modes.
> >
> > More seriously, this code generates invalid display modes for both
> > of the 3D-capable panels that I have (a 42-inch LG TV and a Sony
> > PlayStation 3D Display).
> >
> > If we want to be persnickety, one option would be to check the
> > final list of modes against the table and give some message if
> > none of them are valid, but it's a whole lot easier just to delete
> > the code in question.
> 
> Damien added this in commit c858cfcae6d some 3 years ago.
> 
> Damien, do you remember why you added these "required" modes? Did you
> have a monitor that only advertised 3D support without the actual
> modes?

Another quick glance at the specs leads me to believe c858cfcae6d is
correct.

8-15 does say that a sink supporting 3D must at lesst support one of the
modes listed in that table. But that's just the very start of the story
and we are really talking about the 3D_present bit in the HMDI VSDB and
the associated "mandatory" modes (the term comes from the spec).

HDMI 1.4a Page 155:

"3D_present [1bit] This bit indicates 3D support by the HDMI Sink,
including the mandatory formats. If set (=1), an HDMI Sink supports the
3D video formats that are mandatory formats," 

Continuing page 157:

"If 3D_present is set (=1), an HDMI Sink shall support 3D video formats
per the following requirements.
・An HDMI Sink which supports at least one 59.94 / 60Hz 2D video format
shall support *all* of "
・An HDMI Sink which supports at least one 50Hz 2D video format shall
support *all* of " 

The 3D pdf extraction from the spec is available would one want to
triple check the above:

   http://www.hdmi.org/manufacturer/specification.aspx

I have even dug up a direct link that someone made available:

  https://etmriwi.home.xs4all.nl/forum/hdmi_spec1.4a_3dextraction.pdf

Look for 3D_present, p. 15 and 17.

If the above is indeed correct, there may still be an issue in the way
we derive the mandatory modes - that part isn't really clear. Or, it
could be that people don't follow standards!

HTH,

-- 
Damien


___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [Nouveau] [PATCH 5/6] drm: Delete "mandatory" stereographic modes

2017-01-18 Thread Damien Lespiau
On Wed, Jan 18, 2017 at 04:33:43PM +, Damien Lespiau wrote:
> On Wed, Jan 18, 2017 at 11:27:16AM -0500, Ilia Mirkin wrote:
> > Damien - did you ever test these mandatory modes on an actual
> > commercial 3D TV or similar device?
> 
> My main testing device was a Samsung TV with this 3D_present bit set and
> all the advertised modes were working. Can't quite remember if that
> included the interleaved mode.

I even pushed the EDID of that TV to edid-decode [1] if someone needs to
check that the EDID parsing is correct. It'd be interesting to see what
the tool has to say about the edid of the sink causing problems, in
particular compare the mandatory modes to the other modes advertised by
that TV. Maybe we could see some kind of pattern emerge, like the 3D
modes supported being the ones with the timings in table 8-15.

-- 
Damien

[1] https://cgit.freedesktop.org/xorg/app/edid-decode/
data/samsung-UE40D8000YU-hmdi
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [Nouveau] [PATCH 5/6] drm: Delete "mandatory" stereographic modes

2017-01-18 Thread Damien Lespiau
On Wed, Jan 18, 2017 at 11:27:16AM -0500, Ilia Mirkin wrote:
> Damien - did you ever test these mandatory modes on an actual
> commercial 3D TV or similar device?

My main testing device was a Samsung TV with this 3D_present bit set and
all the advertised modes were working. Can't quite remember if that
included the interleaved mode.

-- 
Damien
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [Nouveau] [PATCH 5/6] drm: Delete "mandatory" stereographic modes

2017-01-18 Thread Damien Lespiau
On Wed, Jan 18, 2017 at 01:48:04PM -0500, Ilia Mirkin wrote:
> After some more conversations with Alastair, it sounds like what's
> actually going on is that it's just the frame-packing modes that
> aren't working, but all the side-by-side and top-and-bottom modes from
> the "mandatory" list work. At this point, I'm more inclined to believe
> that there's an issue in the nouveau implementation for frame-packed
> modes. But it could still be the TVs themselves that don't support
> that at all.

If Alastair has an intel GPU as well, an "easy" way to check if the
frame packing modes of those TVs work would be to use the testdisplay[1]
tool of intel-gpu-tools.

Shameless plug: http://damien.lespiau.name/2013/10/hdmi-stereo-3d-kms.html

Towards the end of the post, there are test display usage examples to go
and test FP modes. Mind you, people have been trying to make
intel-gpu-tools run on any DRM driver when possible, not sure how far we
are with that though.

-- 
Damien

[1] 
http://cgit.freedesktop.org/xorg/app/intel-gpu-tools/tree/tests/testdisplay.c
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[Intel-gfx] drivers/gpu/drm/i915/i915_gem_gtt.c

2015-05-23 Thread Damien Lespiau
On Fri, May 22, 2015 at 02:17:32PM -0700, Andrew Morton wrote:
> I'm not sure what's happened to the drm code in linux-next - it's
> exploding all over the place.  Did someone turn on -Werror without
> doing anywhere near enough testing?
> 
> Anyway, I don't know how to fix this i386 build error:

Seems like you have CONFIG_DRM_I915_WERROR set?

We explicitely made sure to not enable -Werror by default, because
different versions of gcc will generate different set of warnings making
it roughly impossible to use -Werror by default (say, newer versions of
gcc with more clever warnings trying to compile old commits while
bisecting) 

-- 
Damien


[PATCH libdrm] xf86drm: Bound strstr() to the allocated data

2016-01-22 Thread Damien Lespiau
We are reading at most sizeof(data) bytes, but then data may not contain
a terminating '\0', at least in theory, so strstr() may overflow the
stack allocated array.

Make sure that data always contains at least one '\0'.

Signed-off-by: Damien Lespiau 
---
 xf86drm.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/xf86drm.c b/xf86drm.c
index 7e28b4f..5f587d9 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2863,7 +2863,7 @@ static int drmParsePciBusInfo(int maj, int min, 
drmPciBusInfoPtr info)
 {
 #ifdef __linux__
 char path[PATH_MAX + 1];
-char data[128];
+char data[128 + 1];
 char *str;
 int domain, bus, dev, func;
 int fd, ret;
@@ -2874,6 +2874,7 @@ static int drmParsePciBusInfo(int maj, int min, 
drmPciBusInfoPtr info)
 return -errno;

 ret = read(fd, data, sizeof(data));
+data[128] = '\0';
 close(fd);
 if (ret < 0)
 return -errno;
-- 
2.4.3



[Intel-gfx] [PATCH libdrm] xf86drm: Bound strstr() to the allocated data

2016-01-22 Thread Damien Lespiau
On Fri, Jan 22, 2016 at 04:48:05PM +0200, Ville Syrjälä wrote:
> On Fri, Jan 22, 2016 at 12:51:23PM +0000, Damien Lespiau wrote:
> > We are reading at most sizeof(data) bytes, but then data may not contain
> > a terminating '\0', at least in theory, so strstr() may overflow the
> > stack allocated array.
> > 
> > Make sure that data always contains at least one '\0'.
> > 
> > Signed-off-by: Damien Lespiau 
> > ---
> >  xf86drm.c | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> > 
> > diff --git a/xf86drm.c b/xf86drm.c
> > index 7e28b4f..5f587d9 100644
> > --- a/xf86drm.c
> > +++ b/xf86drm.c
> > @@ -2863,7 +2863,7 @@ static int drmParsePciBusInfo(int maj, int min, 
> > drmPciBusInfoPtr info)
> >  {
> >  #ifdef __linux__
> >  char path[PATH_MAX + 1];
> > -char data[128];
> > +char data[128 + 1];
> >  char *str;
> >  int domain, bus, dev, func;
> >  int fd, ret;
> > @@ -2874,6 +2874,7 @@ static int drmParsePciBusInfo(int maj, int min, 
> > drmPciBusInfoPtr info)
> >  return -errno;
> >  
> >  ret = read(fd, data, sizeof(data));
> > +data[128] = '\0';
> 
> Slightly more paranoid would be something along the lines of
> if (ret >= 0)
>   data[ret] = '\0';
> 
> But this should be good enough I think so
> Reviewed-by: Ville Syrjälä 

Thanks for the review, pushed!

> The other thing I spotted while looking at the code is the fact that it
> doesn't check the snprint() return value. But I guess PATH_MAX is big
> enough that even if you somehow make maj and min INT_MIN it'll still
> fit.

Right, doesn't seem we can overflow path[].

-- 
Damien


[PATCH] drm/mst: Avoid reading uninitialized value

2014-07-14 Thread Damien Lespiau
A static analysis tool tells me that we could try to read an
uninitialized 'ret' value. Plug that.

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_dp_mst_topology.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c 
b/drivers/gpu/drm/drm_dp_mst_topology.c
index 369d6c4..813b8d1 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -1644,7 +1644,7 @@ int drm_dp_update_payload_part2(struct 
drm_dp_mst_topology_mgr *mgr)
 {
struct drm_dp_mst_port *port;
int i;
-   int ret;
+   int ret = 0;
mutex_lock(&mgr->payload_lock);
for (i = 0; i < mgr->max_payloads; i++) {

-- 
1.8.3.1



[PATCH] drm/mst: Don't use uninitialized fields of the sideband message header

2014-07-14 Thread Damien Lespiau
We could be using uninitialized fields of the header in
drm_dp_encode_sideband_msg_hdr(), for instance hdr->somt is set to 1 in
the first patcket but never set to 0 otherwise.

Always clear the header at the start then.

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_dp_mst_topology.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c 
b/drivers/gpu/drm/drm_dp_mst_topology.c
index 813b8d1..618526d 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -1290,6 +1290,8 @@ static int process_single_tx_qlock(struct 
drm_dp_mst_topology_mgr *mgr,
int len, space, idx, tosend;
int ret;

+   memset(&hdr, 0, sizeof(struct drm_dp_sideband_msg_hdr));
+
if (txmsg->state == DRM_DP_SIDEBAND_TX_QUEUED) {
txmsg->seqno = -1;
txmsg->state = DRM_DP_SIDEBAND_TX_START_SEND;
-- 
1.8.3.1



[Intel-gfx] [PATCH] drivers/gpu/drm/i915/dma: style fixes

2014-06-02 Thread Damien Lespiau
On Mon, Jun 02, 2014 at 04:59:39PM +0200, Robin Schroer wrote:
> Fixed several double space pointer notations, and added one newline
> 
> Signed-off-by: Robin Schroer 

Reviewed-by: Damien Lespiau 

-- 
Damien


[PATCH] drm/doc: Add the "type" plane property to the list of properties

2014-06-09 Thread Damien Lespiau
Matt aded this plane property before we had a table giving a summary of
the properties. Add it there.

Cc: Matt Roper 
Signed-off-by: Damien Lespiau 
---
 Documentation/DocBook/drm.tmpl | 10 +-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl
index 0854aed..ba405fe 100644
--- a/Documentation/DocBook/drm.tmpl
+++ b/Documentation/DocBook/drm.tmpl
@@ -2466,7 +2466,7 @@ void intel_crt_init(struct drm_device *dev)
Description/Restrictions


-   DRM
+   DRM
Generic
?EDID?
BLOB | IMMUTABLE
@@ -2482,6 +2482,14 @@ void intel_crt_init(struct drm_device *dev)
Contains DPMS operation mode value.


+   Plane
+   ?type?
+   ENUM | IMMUTABLE
+   { "Overlay", "Primary", "Cursor" }
+   Plane
+   Plane type
+   
+   
DVI-I
?subconnector?
ENUM
-- 
1.8.3.1



[PATCH] drm: Remove spurious ';'

2014-06-09 Thread Damien Lespiau
One small step after another, the never-ending crusade towards better
code continues.

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/ast/ast_post.c  | 4 ++--
 drivers/gpu/drm/exynos/exynos_dp_core.c | 2 +-
 drivers/gpu/drm/exynos/exynos_drm_dpi.c | 2 +-
 drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c   | 2 +-
 drivers/gpu/drm/nouveau/core/engine/graph/ctxnvf0.c | 2 +-
 drivers/gpu/drm/nouveau/core/engine/graph/nv50.c| 2 +-
 drivers/gpu/drm/radeon/radeon_bios.c| 2 +-
 7 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/ast/ast_post.c b/drivers/gpu/drm/ast/ast_post.c
index 4e5ea38..38d437f 100644
--- a/drivers/gpu/drm/ast/ast_post.c
+++ b/drivers/gpu/drm/ast/ast_post.c
@@ -1083,7 +1083,7 @@ static void get_ddr3_info(struct ast_private *ast, struct 
ast2300_dram_param *pa
case AST_DRAM_4Gx16:
param->dram_config = 0x133;
break;
-   }; /* switch size */
+   } /* switch size */

switch (param->vram_size) {
default:
@@ -1454,7 +1454,7 @@ static void get_ddr2_info(struct ast_private *ast, struct 
ast2300_dram_param *pa
case AST_DRAM_4Gx16:
param->dram_config = 0x123;
break;
-   }; /* switch size */
+   } /* switch size */

switch (param->vram_size) {
default:
diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c 
b/drivers/gpu/drm/exynos/exynos_dp_core.c
index 5e05dbc..a8ffc8c 100644
--- a/drivers/gpu/drm/exynos/exynos_dp_core.c
+++ b/drivers/gpu/drm/exynos/exynos_dp_core.c
@@ -1087,7 +1087,7 @@ static void exynos_dp_dpms(struct exynos_drm_display 
*display, int mode)
break;
default:
break;
-   };
+   }
dp->dpms_mode = mode;
 }

diff --git a/drivers/gpu/drm/exynos/exynos_drm_dpi.c 
b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
index f1b8587..482127f 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dpi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
@@ -152,7 +152,7 @@ static void exynos_dpi_dpms(struct exynos_drm_display 
*display, int mode)
break;
default:
break;
-   };
+   }
ctx->dpms_mode = mode;
 }

diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c 
b/drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c
index 489ffd2..87885d8 100644
--- a/drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c
+++ b/drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c
@@ -148,7 +148,7 @@ static int handle_dsi_error(struct mdfld_dsi_pkg_sender 
*sender, u32 mask)
break;
case BIT(14):
/*wait for all fifo empty*/
-   /*wait_for_all_fifos_empty(sender)*/;
+   /*wait_for_all_fifos_empty(sender)*/
break;
case BIT(15):
dev_dbg(sender->dev->dev, "No Action required\n");
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvf0.c 
b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvf0.c
index 0fab95e..dec03f0 100644
--- a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvf0.c
+++ b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvf0.c
@@ -842,7 +842,7 @@ nvf0_grctx_generate_mods(struct nvc0_graph_priv *priv, 
struct nvc0_grctx *info)
u16 magic3 = 0x0648;
magic[gpc][0]  = 0x1000 | (magic0 << 16) | offset;
magic[gpc][1]  = 0x | (magic1 << 16);
-   offset += 0x0324 * (priv->tpc_nr[gpc] - 1);;
+   offset += 0x0324 * (priv->tpc_nr[gpc] - 1);
magic[gpc][2]  = 0x1000 | (magic2 << 16) | offset;
magic[gpc][3]  = 0x | (magic3 << 16);
offset += 0x0324;
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c 
b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c
index 2c7809e..1a2d564 100644
--- a/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c
+++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv50.c
@@ -901,7 +901,7 @@ nv50_graph_ctor(struct nouveau_object *parent, struct 
nouveau_object *engine,
nv_engine(priv)->sclass = nvaf_graph_sclass;
break;

-   };
+   }

/* unfortunate hw bug workaround... */
if (nv_device(priv)->chipset != 0x50 &&
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c 
b/drivers/gpu/drm/radeon/radeon_bios.c
index 9ab3097..6a03624 100644
--- a/drivers/gpu/drm/radeon/radeon_bios.c
+++ b/drivers/gpu/drm/radeon/radeon_bios.c
@@ -626,7 +626,7 @@ static bool radeon_acpi_vfct_bios(struct radeon_device 
*rdev)
vhdr->DeviceID != rdev->pdev->device) {
DRM_INFO("ACPI VFCT table is not for this card\n");
goto out_unmap;
-   };
+   }

if (vfct->VBIOSImageOffset + sizeof(VFCT_IMAGE_HEADER) + 
vhdr->ImageLength > tbl_size) {
DRM_ERROR("ACPI VFCT image truncated\n");
-- 
1.8.3.1



[PATCH 0/3] A couple of fixes about the ioctl number split

2014-06-09 Thread Damien Lespiau
It was reported a long time ago the various comments about the DRM/driver
specific ioctl split were confusing. So tried to fix that.

Patch #1 is a bonus patch that removes DRM_ARRAY_SIZE().

-- 
Damien

Damien Lespiau (3):
  drm: Remove DRM_ARRAY_SIZE() for ARRAY_SIZE()
  drm: Driver-specific ioctls range from 0x40 to 0x9f
  drm/i915: Fix the confusing comment about the ioctl limits

 drivers/gpu/drm/armada/armada_drv.c | 2 +-
 drivers/gpu/drm/exynos/exynos_drm_drv.c | 2 +-
 drivers/gpu/drm/gma500/psb_drv.c| 2 +-
 drivers/gpu/drm/i810/i810_dma.c | 2 +-
 drivers/gpu/drm/i915/i915_dma.c | 2 +-
 drivers/gpu/drm/i915/i915_ioc32.c   | 2 +-
 drivers/gpu/drm/mga/mga_ioc32.c | 2 +-
 drivers/gpu/drm/mga/mga_state.c | 2 +-
 drivers/gpu/drm/nouveau/nouveau_ioc32.c | 2 +-
 drivers/gpu/drm/qxl/qxl_ioctl.c | 2 +-
 drivers/gpu/drm/r128/r128_ioc32.c   | 2 +-
 drivers/gpu/drm/r128/r128_state.c   | 2 +-
 drivers/gpu/drm/radeon/radeon_ioc32.c   | 2 +-
 drivers/gpu/drm/radeon/radeon_kms.c | 2 +-
 drivers/gpu/drm/radeon/radeon_state.c   | 2 +-
 drivers/gpu/drm/savage/savage_bci.c | 2 +-
 drivers/gpu/drm/sis/sis_mm.c| 2 +-
 drivers/gpu/drm/via/via_dma.c   | 2 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 2 +-
 include/drm/drmP.h  | 2 --
 include/uapi/drm/drm.h  | 2 +-
 include/uapi/drm/i915_drm.h | 8 ++--
 22 files changed, 26 insertions(+), 24 deletions(-)

-- 
1.8.3.1



[PATCH 2/3] drm: Driver-specific ioctls range from 0x40 to 0x9f

2014-06-09 Thread Damien Lespiau
DRM_COMMAND_END is 0xa0, so the last driver ioctl is 0x9f, not 0x99.

Signed-off-by: Damien Lespiau 
---
 include/uapi/drm/drm.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
index 9abbeb9..b0b8556 100644
--- a/include/uapi/drm/drm.h
+++ b/include/uapi/drm/drm.h
@@ -780,7 +780,7 @@ struct drm_prime_handle {

 /**
  * Device specific ioctls should only be in their respective headers
- * The device specific ioctl range is from 0x40 to 0x99.
+ * The device specific ioctl range is from 0x40 to 0x9f.
  * Generic IOCTLS restart at 0xA0.
  *
  * \sa drmCommandNone(), drmCommandRead(), drmCommandWrite(), and
-- 
1.8.3.1



[PATCH 1/3] drm: Remove DRM_ARRAY_SIZE() for ARRAY_SIZE()

2014-06-09 Thread Damien Lespiau
I cannot see a need to provide a DRM_ version of ARRAY_SIZE(), only used
in a few places. I suspect its usage has been spread by copy & paste
rather than anything else.

Let's just remove it for plain ARRAY_SIZE().

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/armada/armada_drv.c | 2 +-
 drivers/gpu/drm/exynos/exynos_drm_drv.c | 2 +-
 drivers/gpu/drm/gma500/psb_drv.c| 2 +-
 drivers/gpu/drm/i810/i810_dma.c | 2 +-
 drivers/gpu/drm/i915/i915_dma.c | 2 +-
 drivers/gpu/drm/i915/i915_ioc32.c   | 2 +-
 drivers/gpu/drm/mga/mga_ioc32.c | 2 +-
 drivers/gpu/drm/mga/mga_state.c | 2 +-
 drivers/gpu/drm/nouveau/nouveau_ioc32.c | 2 +-
 drivers/gpu/drm/qxl/qxl_ioctl.c | 2 +-
 drivers/gpu/drm/r128/r128_ioc32.c   | 2 +-
 drivers/gpu/drm/r128/r128_state.c   | 2 +-
 drivers/gpu/drm/radeon/radeon_ioc32.c   | 2 +-
 drivers/gpu/drm/radeon/radeon_kms.c | 2 +-
 drivers/gpu/drm/radeon/radeon_state.c   | 2 +-
 drivers/gpu/drm/savage/savage_bci.c | 2 +-
 drivers/gpu/drm/sis/sis_mm.c| 2 +-
 drivers/gpu/drm/via/via_dma.c   | 2 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 2 +-
 include/drm/drmP.h  | 2 --
 20 files changed, 19 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/armada/armada_drv.c 
b/drivers/gpu/drm/armada/armada_drv.c
index 567cfbd..8ab3cd1 100644
--- a/drivers/gpu/drm/armada/armada_drv.c
+++ b/drivers/gpu/drm/armada/armada_drv.c
@@ -402,7 +402,7 @@ static struct platform_driver armada_drm_platform_driver = {

 static int __init armada_drm_init(void)
 {
-   armada_drm_driver.num_ioctls = DRM_ARRAY_SIZE(armada_ioctls);
+   armada_drm_driver.num_ioctls = ARRAY_SIZE(armada_ioctls);
return platform_driver_register(&armada_drm_platform_driver);
 }
 module_init(armada_drm_init);
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c 
b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index 87461d4..ddb5003 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -569,7 +569,7 @@ static int exynos_drm_platform_probe(struct platform_device 
*pdev)
int ret;

pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
-   exynos_drm_driver.num_ioctls = DRM_ARRAY_SIZE(exynos_ioctls);
+   exynos_drm_driver.num_ioctls = ARRAY_SIZE(exynos_ioctls);

 #ifdef CONFIG_DRM_EXYNOS_FIMD
ret = platform_driver_register(&fimd_driver);
diff --git a/drivers/gpu/drm/gma500/psb_drv.c b/drivers/gpu/drm/gma500/psb_drv.c
index 59ea45e..6e8fe9e 100644
--- a/drivers/gpu/drm/gma500/psb_drv.c
+++ b/drivers/gpu/drm/gma500/psb_drv.c
@@ -477,7 +477,7 @@ static struct drm_driver driver = {
.lastclose = psb_driver_lastclose,
.preclose = psb_driver_preclose,

-   .num_ioctls = DRM_ARRAY_SIZE(psb_ioctls),
+   .num_ioctls = ARRAY_SIZE(psb_ioctls),
.device_is_agp = psb_driver_device_is_agp,
.irq_preinstall = psb_irq_preinstall,
.irq_postinstall = psb_irq_postinstall,
diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c
index aeace37..e88bac1 100644
--- a/drivers/gpu/drm/i810/i810_dma.c
+++ b/drivers/gpu/drm/i810/i810_dma.c
@@ -1251,7 +1251,7 @@ const struct drm_ioctl_desc i810_ioctls[] = {
DRM_IOCTL_DEF_DRV(I810_FLIP, i810_flip_bufs, DRM_AUTH|DRM_UNLOCKED),
 };

-int i810_max_ioctl = DRM_ARRAY_SIZE(i810_ioctls);
+int i810_max_ioctl = ARRAY_SIZE(i810_ioctls);

 /**
  * Determine if the device really is AGP or not.
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 93c0e1a..7c63b18 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -2025,7 +2025,7 @@ const struct drm_ioctl_desc i915_ioctls[] = {
DRM_IOCTL_DEF_DRV(I915_GEM_USERPTR, i915_gem_userptr_ioctl, 
DRM_UNLOCKED|DRM_RENDER_ALLOW),
 };

-int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls);
+int i915_max_ioctl = ARRAY_SIZE(i915_ioctls);

 /*
  * This is really ugly: Because old userspace abused the linux agp interface to
diff --git a/drivers/gpu/drm/i915/i915_ioc32.c 
b/drivers/gpu/drm/i915/i915_ioc32.c
index 3c59584..2e0613e 100644
--- a/drivers/gpu/drm/i915/i915_ioc32.c
+++ b/drivers/gpu/drm/i915/i915_ioc32.c
@@ -208,7 +208,7 @@ long i915_compat_ioctl(struct file *filp, unsigned int cmd, 
unsigned long arg)
if (nr < DRM_COMMAND_BASE)
return drm_compat_ioctl(filp, cmd, arg);

-   if (nr < DRM_COMMAND_BASE + DRM_ARRAY_SIZE(i915_compat_ioctls))
+   if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(i915_compat_ioctls))
fn = i915_compat_ioctls[nr - DRM_COMMAND_BASE];

if (fn != NULL)
diff --git a/drivers/gpu/drm/mga/mga_ioc32.c b/drivers/gpu/drm/mga/mga_ioc32.c
index 86b4bb8..729bfd5 100644
--- a/drivers/gpu/drm/mga/mga_ioc32.c
+++ b/drivers/gpu/drm/mga/mga_ioc32.c
@@ -214,7 +214,7 @@ long mga_compat_ioctl(struct file *filp, unsigned int cmd, 
unsigned long arg)
if (nr < DRM_COMM

[PATCH 3/3] drm/i915: Fix the confusing comment about the ioctl limits

2014-06-09 Thread Damien Lespiau
It was reported that this comment was confusing, and indeed it is.

Signed-off-by: Damien Lespiau 
---
 include/uapi/drm/i915_drm.h | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index ff57f07..eacd063 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -171,8 +171,12 @@ typedef struct _drm_i915_sarea {
 #define I915_BOX_TEXTURE_LOAD  0x8
 #define I915_BOX_LOST_CONTEXT  0x10

-/* I915 specific ioctls
- * The device specific ioctl range is 0x40 to 0x79.
+/*
+ * i915 specific ioctls.
+ *
+ * The device specific ioctl range is [DRM_COMMAND_BASE, DRM_COMMAND_END) ie
+ * [0x40, 0xa0) (a0 is excluded) and those defines are offsets from
+ * DRM_COMMAND_BASE.
  */
 #define DRM_I915_INIT  0x00
 #define DRM_I915_FLUSH 0x01
-- 
1.8.3.1



[PATCH] drm/doc: Fix nouveau typo

2014-06-09 Thread Damien Lespiau
Signed-off-by: Damien Lespiau 
---
 Documentation/DocBook/drm.tmpl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl
index efef637..0854aed 100644
--- a/Documentation/DocBook/drm.tmpl
+++ b/Documentation/DocBook/drm.tmpl
@@ -3045,7 +3045,7 @@ void intel_crt_init(struct drm_device *dev)
TBD


-   noveau
+   nouveau
NV10 Overlay
"colorkey"
RANGE
-- 
1.8.3.1



[PATCH libdrm 1/2] intel: Sync the command parser version parameter from kernel

2014-06-19 Thread Damien Lespiau
Cc: Bradley Volkin 
Signed-off-by: Damien Lespiau 
---
 include/drm/i915_drm.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h
index 2f4eb8c..980dbf8 100644
--- a/include/drm/i915_drm.h
+++ b/include/drm/i915_drm.h
@@ -337,6 +337,7 @@ typedef struct drm_i915_irq_wait {
 #define I915_PARAM_HAS_EXEC_NO_RELOC25
 #define I915_PARAM_HAS_EXEC_HANDLE_LUT   26
 #define I915_PARAM_HAS_WT   27
+#define I915_PARAM_CMD_PARSER_VERSION   28

 typedef struct drm_i915_getparam {
int param;
-- 
1.8.3.1



[PATCH libdrm 2/2] intel: Sync typo fix from the kernel sources.

2014-06-19 Thread Damien Lespiau
Signed-off-by: Damien Lespiau 
---
 include/drm/i915_drm.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h
index 980dbf8..8eb0cb3 100644
--- a/include/drm/i915_drm.h
+++ b/include/drm/i915_drm.h
@@ -722,7 +722,7 @@ struct drm_i915_gem_execbuffer2 {
  */
 #define I915_EXEC_IS_PINNED(1<<10)

-/** Provide a hint to the kernel that the command stream and auxilliary
+/** Provide a hint to the kernel that the command stream and auxiliary
  * state buffers already holds the correct presumed addresses and so the
  * relocation process may be skipped if no buffers need to be moved in
  * preparation for the execbuffer.
-- 
1.8.3.1



[PATCH libdrm 1/2] intel: Sync the command parser version parameter from kernel

2014-06-19 Thread Damien Lespiau
On Thu, Jun 19, 2014 at 09:28:08AM -0700, Volkin, Bradley D wrote:
> On Thu, Jun 19, 2014 at 11:31:53AM +0100, Damien Lespiau wrote:
> > Cc: Bradley Volkin 
> > Signed-off-by: Damien Lespiau 
> 
> Thanks for taking care of this Damien.
> 
> Reviewed-by: Brad Volkin 

Thanks for the review, pushed both patches.

-- 
Damien


[edid-decode] Decode HDMI 1.4 4k VICs

2013-07-30 Thread Damien Lespiau
Signed-off-by: Damien Lespiau 
---
 edid-decode.c | 15 +--
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/edid-decode.c b/edid-decode.c
index 9840db6..f74bbe4 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -625,7 +625,7 @@ cea_hdmi_block(unsigned char *x)

if (x[8] & 0x20) {
int mask = 0, formats = 0;
-   int len_xx, len_3d;
+   int len_vic, len_3d;
printf("Extended HDMI video details:\n");
if (x[9 + b] & 0x80)
printf("  3D present\n");
@@ -650,14 +650,17 @@ cea_hdmi_block(unsigned char *x)
printf("  Base EDID image size is in units of 5cm\n");
break;
}
-   len_xx = (x[10 + b] & 0xe0) >> 5;
+   len_vic = (x[10 + b] & 0xe0) >> 5;
len_3d = (x[10 + b] & 0x1f) >> 0;
b += 2;
 
-   if (len_xx) {
-   printf("  Skipping %d bytes that HDMI refuses to publicly"
-  " document\n", len_xx);
-   b += len_xx;
+   if (len_vic) {
+   int i;
+
+   for (i = 0; i < len_vic; i++)
+   printf("  HDMI VIC %d\n", x[9 + b + i]);
+
+   b += len_vic;
}
 
if (len_3d) {
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] drm: Don't generate invalid AVI infoframes for CEA modes

2013-08-05 Thread Damien Lespiau
>From CEA-861:

  Data Byte 1, bit A0 indicates whether Active Format Data is present in
  Data Byte 2 bits R3 through R0. A source device shall set A0=1 when
  any of the AFD bits are set.

ie. if we want to set active_aspect, we need to set the
active_info_valid bit to 1 as well.

Cc: Thierry Reding 
Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 95d6f4b..8d1139f 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3107,6 +3107,7 @@ drm_hdmi_avi_infoframe_from_display_mode(struct 
hdmi_avi_infoframe *frame,
return 0;
 
frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
+   frame->active_info_valid = 1;
frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
 
return 0;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] drm: Don't generate invalid AVI infoframes for CEA modes

2013-08-05 Thread Damien Lespiau
On Mon, Aug 05, 2013 at 04:54:06PM +0300, Ville Syrjälä wrote:
> On Mon, Aug 05, 2013 at 02:36:47PM +0100, Damien Lespiau wrote:
> > >From CEA-861:
> > 
> >   Data Byte 1, bit A0 indicates whether Active Format Data is present in
> >   Data Byte 2 bits R3 through R0. A source device shall set A0=1 when
> >   any of the AFD bits are set.
> > 
> > ie. if we want to set active_aspect, we need to set the
> > active_info_valid bit to 1 as well.
> > 
> > Cc: Thierry Reding 
> > Signed-off-by: Damien Lespiau 
> 
> Reviewed-by: Ville Syrjälä 
> 
> But why don't we just kill active_info_valid and instead just
> check active_aspect in hdmi_avi_infoframe_pack()?

Right, so I thought about that, I'd love to have an API that doesn't
allow its user to do something wrong. My reflections so far:

 1/ I did not want to depend on a fix that was outside of the drm/
 directory for people that pull that directory between different
 kernels, they will end up missing the patch in video/hdmi.c.

 On the other hand, we could just tell people to sync
 drivers/video/hdmi.c and include/linux/hdmi.h along with drm/.

 2/ I was thinking that killing the _valid bits in the
 hdmi_avi_infoframe struct would not allow an _unpack() function that
 can check if the infoframe was valid.

Probably thinking too much though...

-- 
Damien
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] drm: Don't generate invalid AVI infoframes for CEA modes

2013-08-05 Thread Damien Lespiau
On Mon, Aug 05, 2013 at 09:07:05PM +0300, Ville Syrjälä wrote:
> On Mon, Aug 05, 2013 at 02:36:47PM +0100, Damien Lespiau wrote:
> > >From CEA-861:
> > 
> >   Data Byte 1, bit A0 indicates whether Active Format Data is present in
> >   Data Byte 2 bits R3 through R0. A source device shall set A0=1 when
> >   any of the AFD bits are set.
> > 
> > ie. if we want to set active_aspect, we need to set the
> > active_info_valid bit to 1 as well.
> > 
> > Cc: Thierry Reding 
> > Signed-off-by: Damien Lespiau 
> > ---
> >  drivers/gpu/drm/drm_edid.c | 1 +
> >  1 file changed, 1 insertion(+)
> > 
> > diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> > index 95d6f4b..8d1139f 100644
> > --- a/drivers/gpu/drm/drm_edid.c
> > +++ b/drivers/gpu/drm/drm_edid.c
> > @@ -3107,6 +3107,7 @@ drm_hdmi_avi_infoframe_from_display_mode(struct 
> > hdmi_avi_infoframe *frame,
> > return 0;
> 
> Nothing to do with this patch, but I just spotted this return here. So
> we're not populating the aspect ratio stuff if VIC=0. Doesn't really
> make sense to me. Who will tell me what this is trying to achieve?

I wondered about that to. The intent seems to not set those bits when
we're not setting a CEA mode. I guess the author thought that only CEA
modes can understand the infoframes described in CEA-861. I haven't
found any evidence of that, but made some sense to me.

-- 
Damien
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


Port the i915 HDMI infoframe code to the common infrastructure v2

2013-08-06 Thread Damien Lespiau
Re-posting the whole series because I forgot dri-devel in the first version and
also added a few patches from the review.

Version 2 of the series:
  http://lists.freedesktop.org/archives/intel-gfx/2013-August/031183.html

With Ville's comments so far addressed.

I've also added the already posted drm patch:
  http://lists.freedesktop.org/archives/dri-devel/2013-August/042900.html
in this version as we depend on it to not generate invalid infoframe after
having ported i915 to the generic helpers.

-- 
Damien

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 01/12] video/hdmi: Replace the payload length by their defines

2013-08-06 Thread Damien Lespiau
Cc: Thierry Reding 
Reviewed-by: Ville Syrjälä 
Signed-off-by: Damien Lespiau 
---
 drivers/video/hdmi.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index 4017833..dbd882f 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -52,7 +52,7 @@ int hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *frame)
 
frame->type = HDMI_INFOFRAME_TYPE_AVI;
frame->version = 2;
-   frame->length = 13;
+   frame->length = HDMI_AVI_INFOFRAME_SIZE;
 
return 0;
 }
@@ -151,7 +151,7 @@ int hdmi_spd_infoframe_init(struct hdmi_spd_infoframe 
*frame,
 
frame->type = HDMI_INFOFRAME_TYPE_SPD;
frame->version = 1;
-   frame->length = 25;
+   frame->length = HDMI_SPD_INFOFRAME_SIZE;
 
strncpy(frame->vendor, vendor, sizeof(frame->vendor));
strncpy(frame->product, product, sizeof(frame->product));
@@ -218,7 +218,7 @@ int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe 
*frame)
 
frame->type = HDMI_INFOFRAME_TYPE_AUDIO;
frame->version = 1;
-   frame->length = 10;
+   frame->length = HDMI_AUDIO_INFOFRAME_SIZE;
 
return 0;
 }
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 02/12] video/hdmi: Introduce a generic hdmi_infoframe union

2013-08-06 Thread Damien Lespiau
And a way to pack hdmi_infoframe generically.

Cc: Thierry Reding 
Reviewed-by: Ville Syrjälä 
Signed-off-by: Damien Lespiau 
---
 drivers/video/hdmi.c | 43 +++
 include/linux/hdmi.h | 17 +
 2 files changed, 60 insertions(+)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index dbd882f..f7a85e5 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -22,6 +22,7 @@
  */
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -321,3 +322,45 @@ ssize_t hdmi_vendor_infoframe_pack(struct 
hdmi_vendor_infoframe *frame,
return length;
 }
 EXPORT_SYMBOL(hdmi_vendor_infoframe_pack);
+
+/**
+ * hdmi_infoframe_pack() - write a HDMI infoframe to binary buffer
+ * @frame: HDMI infoframe
+ * @buffer: destination buffer
+ * @size: size of buffer
+ *
+ * Packs the information contained in the @frame structure into a binary
+ * representation that can be written into the corresponding controller
+ * registers. Also computes the checksum as required by section 5.3.5 of
+ * the HDMI 1.4 specification.
+ *
+ * Returns the number of bytes packed into the binary buffer or a negative
+ * error code on failure.
+ */
+ssize_t
+hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer, size_t size)
+{
+   ssize_t length;
+
+   switch (frame->any.type) {
+   case HDMI_INFOFRAME_TYPE_AVI:
+   length = hdmi_avi_infoframe_pack(&frame->avi, buffer, size);
+   break;
+   case HDMI_INFOFRAME_TYPE_SPD:
+   length = hdmi_spd_infoframe_pack(&frame->spd, buffer, size);
+   break;
+   case HDMI_INFOFRAME_TYPE_AUDIO:
+   length = hdmi_audio_infoframe_pack(&frame->audio, buffer, size);
+   break;
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   length = hdmi_vendor_infoframe_pack(&frame->vendor,
+   buffer, size);
+   break;
+   default:
+   WARN(1, "Bad infoframe type %d\n", frame->any.type);
+   length = -EINVAL;
+   }
+
+   return length;
+}
+EXPORT_SYMBOL(hdmi_infoframe_pack);
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index 3b58944..0f3f82e 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -23,6 +23,12 @@ enum hdmi_infoframe_type {
 #define HDMI_SPD_INFOFRAME_SIZE25
 #define HDMI_AUDIO_INFOFRAME_SIZE  10
 
+struct hdmi_any_infoframe {
+   enum hdmi_infoframe_type type;
+   unsigned char version;
+   unsigned char length;
+};
+
 enum hdmi_colorspace {
HDMI_COLORSPACE_RGB,
HDMI_COLORSPACE_YUV422,
@@ -228,4 +234,15 @@ struct hdmi_vendor_infoframe {
 ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
   void *buffer, size_t size);
 
+union hdmi_infoframe {
+   struct hdmi_any_infoframe any;
+   struct hdmi_avi_infoframe avi;
+   struct hdmi_spd_infoframe spd;
+   struct hdmi_vendor_infoframe vendor;
+   struct hdmi_audio_infoframe audio;
+};
+
+ssize_t
+hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer, size_t size);
+
 #endif /* _DRM_HDMI_H */
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 03/12] video/hdmi: Add a macro to return the size of a full infoframe

2013-08-06 Thread Damien Lespiau
Cc: Thierry Reding 
Reviewed-by: Ville Syrjälä 
Signed-off-by: Damien Lespiau 
---
 include/linux/hdmi.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index 0f3f82e..bc6743e 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -23,6 +23,9 @@ enum hdmi_infoframe_type {
 #define HDMI_SPD_INFOFRAME_SIZE25
 #define HDMI_AUDIO_INFOFRAME_SIZE  10
 
+#define HDMI_INFOFRAME_SIZE(type)  \
+   (HDMI_INFOFRAME_HEADER_SIZE + HDMI_ ## type ## _INFOFRAME_SIZE)
+
 struct hdmi_any_infoframe {
enum hdmi_infoframe_type type;
unsigned char version;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 04/12] video/hmdi: Clear the whole incoming buffer, not just the infoframe size

2013-08-06 Thread Damien Lespiau
If the user if this API is providing a bigger buffer than the infoframe
size, it could be for a could reason. For instance it could be because
it gives the buffer that will be written to the hardware, up to the
maximum of an infoframe size.

Instead of just zeroing up to the infoframe size, let's zero the whole
incoming buffer as those extra bytes are also used to compute the
ECC and need to be 0.

Signed-off-by: Damien Lespiau 
---
 drivers/video/hdmi.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index f7a85e5..635d569 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -84,7 +84,7 @@ ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe 
*frame, void *buffer,
if (size < length)
return -ENOSPC;
 
-   memset(buffer, 0, length);
+   memset(buffer, 0, size);
 
ptr[0] = frame->type;
ptr[1] = frame->version;
@@ -186,7 +186,7 @@ ssize_t hdmi_spd_infoframe_pack(struct hdmi_spd_infoframe 
*frame, void *buffer,
if (size < length)
return -ENOSPC;
 
-   memset(buffer, 0, length);
+   memset(buffer, 0, size);
 
ptr[0] = frame->type;
ptr[1] = frame->version;
@@ -251,7 +251,7 @@ ssize_t hdmi_audio_infoframe_pack(struct 
hdmi_audio_infoframe *frame,
if (size < length)
return -ENOSPC;
 
-   memset(buffer, 0, length);
+   memset(buffer, 0, size);
 
if (frame->channels >= 2)
channels = frame->channels - 1;
@@ -308,7 +308,7 @@ ssize_t hdmi_vendor_infoframe_pack(struct 
hdmi_vendor_infoframe *frame,
if (size < length)
return -ENOSPC;
 
-   memset(buffer, 0, length);
+   memset(buffer, 0, size);
 
ptr[0] = frame->type;
ptr[1] = frame->version;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 05/12] drm: Don't generate invalid AVI infoframes for CEA modes

2013-08-06 Thread Damien Lespiau
From CEA-861:

  Data Byte 1, bit A0 indicates whether Active Format Data is present in
  Data Byte 2 bits R3 through R0. A source device shall set A0=1 when
  any of the AFD bits are set.

ie. if we want to set active_aspect, we need to set the
active_info_valid bit to 1 as well.

Cc: Thierry Reding 
Reviewed-by: Ville Syrjälä 
Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 95d6f4b..8d1139f 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3107,6 +3107,7 @@ drm_hdmi_avi_infoframe_from_display_mode(struct 
hdmi_avi_infoframe *frame,
return 0;
 
frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
+   frame->active_info_valid = 1;
frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
 
return 0;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 06/12] drm/i915/hdmi: Change the write_infoframe vfunc to take a buffer and a type

2013-08-06 Thread Damien Lespiau
First step in the move to the shared infoframe infrastructure, let's
move the different infoframe helpers and the write_infoframe() vfunc to
a type (enum hdmi_infoframe_type) and a buffer + len instead of using
our struct dip_infoframe.

v2: constify the infoframe pointer and don't mix signs (Ville Syrjälä)

Signed-off-by: Damien Lespiau 
Signed-off-by: Paulo Zanoni 
Signed-off-by: Thierry Reding 
---
 drivers/gpu/drm/i915/intel_drv.h  |   4 +-
 drivers/gpu/drm/i915/intel_hdmi.c | 106 --
 2 files changed, 59 insertions(+), 51 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 474797b..273acfd 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -26,6 +26,7 @@
 #define __INTEL_DRV_H__
 
 #include 
+#include 
 #include 
 #include "i915_drv.h"
 #include 
@@ -463,7 +464,8 @@ struct intel_hdmi {
enum hdmi_force_audio force_audio;
bool rgb_quant_range_selectable;
void (*write_infoframe)(struct drm_encoder *encoder,
-   struct dip_infoframe *frame);
+   enum hdmi_infoframe_type type,
+   const uint8_t *frame, ssize_t len);
void (*set_infoframes)(struct drm_encoder *encoder,
   struct drm_display_mode *adjusted_mode);
 };
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index e82cd81..ee67e23 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -29,6 +29,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -81,74 +82,75 @@ void intel_dip_infoframe_csum(struct dip_infoframe *frame)
frame->checksum = 0x100 - sum;
 }
 
-static u32 g4x_infoframe_index(struct dip_infoframe *frame)
+static u32 g4x_infoframe_index(enum hdmi_infoframe_type type)
 {
-   switch (frame->type) {
-   case DIP_TYPE_AVI:
+   switch (type) {
+   case HDMI_INFOFRAME_TYPE_AVI:
return VIDEO_DIP_SELECT_AVI;
-   case DIP_TYPE_SPD:
+   case HDMI_INFOFRAME_TYPE_SPD:
return VIDEO_DIP_SELECT_SPD;
default:
-   DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
+   DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
}
 }
 
-static u32 g4x_infoframe_enable(struct dip_infoframe *frame)
+static u32 g4x_infoframe_enable(enum hdmi_infoframe_type type)
 {
-   switch (frame->type) {
-   case DIP_TYPE_AVI:
+   switch (type) {
+   case HDMI_INFOFRAME_TYPE_AVI:
return VIDEO_DIP_ENABLE_AVI;
-   case DIP_TYPE_SPD:
+   case HDMI_INFOFRAME_TYPE_SPD:
return VIDEO_DIP_ENABLE_SPD;
default:
-   DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
+   DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
}
 }
 
-static u32 hsw_infoframe_enable(struct dip_infoframe *frame)
+static u32 hsw_infoframe_enable(enum hdmi_infoframe_type type)
 {
-   switch (frame->type) {
-   case DIP_TYPE_AVI:
+   switch (type) {
+   case HDMI_INFOFRAME_TYPE_AVI:
return VIDEO_DIP_ENABLE_AVI_HSW;
-   case DIP_TYPE_SPD:
+   case HDMI_INFOFRAME_TYPE_SPD:
return VIDEO_DIP_ENABLE_SPD_HSW;
default:
-   DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
+   DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
}
 }
 
-static u32 hsw_infoframe_data_reg(struct dip_infoframe *frame,
+static u32 hsw_infoframe_data_reg(enum hdmi_infoframe_type type,
  enum transcoder cpu_transcoder)
 {
-   switch (frame->type) {
-   case DIP_TYPE_AVI:
+   switch (type) {
+   case HDMI_INFOFRAME_TYPE_AVI:
return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder);
-   case DIP_TYPE_SPD:
+   case HDMI_INFOFRAME_TYPE_SPD:
return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder);
default:
-   DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
+   DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
}
 }
 
 static void g4x_write_infoframe(struct drm_encoder *encoder,
-   struct dip_infoframe *frame)
+   enum hdmi_infoframe_type type,
+   const uint8_t *frame, ssize_t len)
 {
uint32_t *data = (uint32_t *)frame;
struct drm_device *dev = encoder->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
u32 val = I915_READ(VIDEO_DIP_CTL);
-   unsigned i, len = DIP_HEA

[PATCH 08/12] drm/i915/sdvo: Port the infoframe code to the shared infrastructure

2013-08-06 Thread Damien Lespiau
Reviewed-by: Ville Syrjälä 
Signed-off-by: Damien Lespiau 
Signed-off-by: Paulo Zanoni 
Signed-off-by: Thierry Reding 
---
 drivers/gpu/drm/i915/intel_sdvo.c | 38 --
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_sdvo.c 
b/drivers/gpu/drm/i915/intel_sdvo.c
index 47423f3..02f220b 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -963,30 +963,32 @@ static bool intel_sdvo_write_infoframe(struct intel_sdvo 
*intel_sdvo,
 static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo,
 const struct drm_display_mode 
*adjusted_mode)
 {
-   struct dip_infoframe avi_if = {
-   .type = DIP_TYPE_AVI,
-   .ver = DIP_VERSION_AVI,
-   .len = DIP_LEN_AVI,
-   };
-   uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)];
-   struct intel_crtc *intel_crtc = 
to_intel_crtc(intel_sdvo->base.base.crtc);
+   uint8_t sdvo_data[HDMI_INFOFRAME_SIZE(AVI)];
+   struct drm_crtc *crtc = intel_sdvo->base.base.crtc;
+   struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+   union hdmi_infoframe frame;
+   int ret;
+   ssize_t len;
+
+   ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
+  adjusted_mode);
+   if (ret < 0) {
+   DRM_ERROR("couldn't fill AVI infoframe\n");
+   return false;
+   }
 
if (intel_sdvo->rgb_quant_range_selectable) {
if (intel_crtc->config.limited_color_range)
-   avi_if.body.avi.ITC_EC_Q_SC |= 
DIP_AVI_RGB_QUANT_RANGE_LIMITED;
+   frame.avi.quantization_range =
+   HDMI_QUANTIZATION_RANGE_LIMITED;
else
-   avi_if.body.avi.ITC_EC_Q_SC |= 
DIP_AVI_RGB_QUANT_RANGE_FULL;
+   frame.avi.quantization_range =
+   HDMI_QUANTIZATION_RANGE_FULL;
}
 
-   avi_if.body.avi.VIC = drm_match_cea_mode(adjusted_mode);
-
-   intel_dip_infoframe_csum(&avi_if);
-
-   /* sdvo spec says that the ecc is handled by the hw, and it looks like
-* we must not send the ecc field, either. */
-   memcpy(sdvo_data, &avi_if, 3);
-   sdvo_data[3] = avi_if.checksum;
-   memcpy(&sdvo_data[4], &avi_if.body, sizeof(avi_if.body.avi));
+   len = hdmi_infoframe_pack(&frame, sdvo_data, sizeof(sdvo_data));
+   if (len < 0)
+   return false;
 
return intel_sdvo_write_infoframe(intel_sdvo, SDVO_HBUF_INDEX_AVI_IF,
  SDVO_HBUF_TX_VSYNC,
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 11/12] drm: Set aspect ratio fields in the AVI infoframe even for non CEA modes

2013-08-06 Thread Damien Lespiau
I cannot find any evidence what we shouldn't try to set those fields
when setting a non-CEA mode on an HDMI sink. So just kill that return.

Suggested-by: Ville Syrjälä 
Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index a9c8980..dfc7a1b 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3106,8 +3106,6 @@ drm_hdmi_avi_infoframe_from_display_mode(struct 
hdmi_avi_infoframe *frame,
frame->pixel_repeat = 1;
 
frame->video_code = drm_match_cea_mode(mode);
-   if (!frame->video_code)
-   return 0;
 
frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
frame->active_info_valid = 1;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 07/12] drm/i915/hdmi: Port the infoframe code to the common hdmi helpers

2013-08-06 Thread Damien Lespiau
Let's use the drivers/video/hmdi.c and drm infoframe helpers to build
our infoframes.

v2: Simplify the logic to compute the buffer size. We can just take the
maximum infoframe size rounded to 32, which happens to be what the
hardware let us write anyway.

v3: Remove unnecessary memset() (Ville Syrjälä)

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/i915/intel_hdmi.c | 82 +++
 1 file changed, 58 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index ee67e23..455dfa7 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -325,14 +325,43 @@ static void hsw_write_infoframe(struct drm_encoder 
*encoder,
POSTING_READ(ctl_reg);
 }
 
+/*
+ * The data we write to the DIP data buffer registers is 1 byte bigger than the
+ * HDMI infoframe size because of an ECC/reserved byte at position 3 (starting
+ * at 0). It's also a byte used by DisplayPort so the same DIP registers can be
+ * used for both technologies.
+ *
+ * DW0: Reserved/ECC/DP | HB2 | HB1 | HB0
+ * DW1:   DB3   | DB2 | DB1 | DB0
+ * DW2:   DB7   | DB6 | DB5 | DB4
+ * DW3: ...
+ *
+ * (HB is Header Byte, DB is Data Byte)
+ *
+ * The hdmi pack() functions don't know about that hardware specific hole so we
+ * trick them by giving an offset into the buffer and moving back the header
+ * bytes by one.
+ */
 static void intel_set_infoframe(struct drm_encoder *encoder,
-   struct dip_infoframe *frame)
+   union hdmi_infoframe *frame)
 {
struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
+   uint8_t buffer[VIDEO_DIP_DATA_SIZE];
+   ssize_t len;
 
-   intel_dip_infoframe_csum(frame);
-   intel_hdmi->write_infoframe(encoder, frame->type, (uint8_t *)frame,
-   DIP_HEADER_SIZE + frame->len);
+   /* see comment above for the reason for this offset */
+   len = hdmi_infoframe_pack(frame, buffer + 1, sizeof(buffer) - 1);
+   if (len < 0)
+   return;
+
+   /* Insert the 'hole' (see big comment above) at position 3 */
+   buffer[0] = buffer[1];
+   buffer[1] = buffer[2];
+   buffer[2] = buffer[3];
+   buffer[3] = 0;
+   len++;
+
+   intel_hdmi->write_infoframe(encoder, frame->any.type, buffer, len);
 }
 
 static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
@@ -340,40 +369,45 @@ static void intel_hdmi_set_avi_infoframe(struct 
drm_encoder *encoder,
 {
struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
-   struct dip_infoframe avi_if = {
-   .type = DIP_TYPE_AVI,
-   .ver = DIP_VERSION_AVI,
-   .len = DIP_LEN_AVI,
-   };
+   union hdmi_infoframe frame;
+   int ret;
+
+   ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
+  adjusted_mode);
+   if (ret < 0) {
+   DRM_ERROR("couldn't fill AVI infoframe\n");
+   return;
+   }
 
if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
-   avi_if.body.avi.YQ_CN_PR |= DIP_AVI_PR_2;
+   frame.avi.pixel_repeat = 1;
 
if (intel_hdmi->rgb_quant_range_selectable) {
if (intel_crtc->config.limited_color_range)
-   avi_if.body.avi.ITC_EC_Q_SC |= 
DIP_AVI_RGB_QUANT_RANGE_LIMITED;
+   frame.avi.quantization_range =
+   HDMI_QUANTIZATION_RANGE_LIMITED;
else
-   avi_if.body.avi.ITC_EC_Q_SC |= 
DIP_AVI_RGB_QUANT_RANGE_FULL;
+   frame.avi.quantization_range =
+   HDMI_QUANTIZATION_RANGE_FULL;
}
 
-   avi_if.body.avi.VIC = drm_match_cea_mode(adjusted_mode);
-
-   intel_set_infoframe(encoder, &avi_if);
+   intel_set_infoframe(encoder, &frame);
 }
 
 static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
 {
-   struct dip_infoframe spd_if;
+   union hdmi_infoframe frame;
+   int ret;
+
+   ret = hdmi_spd_infoframe_init(&frame.spd, "Intel", "Integrated gfx");
+   if (ret < 0) {
+   DRM_ERROR("couldn't fill SPD infoframe\n");
+   return;
+   }
 
-   memset(&spd_if, 0, sizeof(spd_if));
-   spd_if.type = DIP_TYPE_SPD;
-   spd_if.ver = DIP_VERSION_SPD;
-   spd_if.len = DIP_LEN_SPD;
-   strcpy(spd_if.body.spd.vn, "Intel");
-   strcpy(spd_if.body.spd.pd, "Integrated gfx");
-   spd_if.body.spd.sdi = DIP_SPD_PC;
+   frame.spd.sdi = HDMI_SPD_SDI_PC;
 
-   intel_s

[PATCH 12/12] drm/i915/hmdi: Rename set_infoframe() to write_infoframe()

2013-08-06 Thread Damien Lespiau
set_frame() wraps the write_frame() vfunc. Be consistent and name the
wrapping function like the vfunc being called.

It's doubly confusing as we also have a set_infoframes() vfunc and
set_infoframe() doesn't wrap it.

Reviewed-by: Ville Syrjälä 
Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/i915/intel_hdmi.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index 80fbe2d..789f909 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -327,8 +327,8 @@ static void hsw_write_infoframe(struct drm_encoder *encoder,
  * trick them by giving an offset into the buffer and moving back the header
  * bytes by one.
  */
-static void intel_set_infoframe(struct drm_encoder *encoder,
-   union hdmi_infoframe *frame)
+static void intel_write_infoframe(struct drm_encoder *encoder,
+ union hdmi_infoframe *frame)
 {
struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
uint8_t buffer[VIDEO_DIP_DATA_SIZE];
@@ -373,7 +373,7 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder 
*encoder,
HDMI_QUANTIZATION_RANGE_FULL;
}
 
-   intel_set_infoframe(encoder, &frame);
+   intel_write_infoframe(encoder, &frame);
 }
 
 static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
@@ -389,7 +389,7 @@ static void intel_hdmi_set_spd_infoframe(struct drm_encoder 
*encoder)
 
frame.spd.sdi = HDMI_SPD_SDI_PC;
 
-   intel_set_infoframe(encoder, &frame);
+   intel_write_infoframe(encoder, &frame);
 }
 
 static void g4x_set_infoframes(struct drm_encoder *encoder,
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 09/12] drm/i915: Remove the now obsolete infoframe definitions

2013-08-06 Thread Damien Lespiau
All the HDMI infoframe code has been ported to use video/hdmi.c, so it's
time to say bye bye to this code.

Reviewed-by: Ville Syrjälä 
Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/i915/intel_drv.h  | 61 ---
 drivers/gpu/drm/i915/intel_hdmi.c | 15 --
 2 files changed, 76 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 273acfd..125df0b 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -394,66 +394,6 @@ struct cxsr_latency {
 #define to_intel_framebuffer(x) container_of(x, struct intel_framebuffer, base)
 #define to_intel_plane(x) container_of(x, struct intel_plane, base)
 
-#define DIP_HEADER_SIZE5
-
-#define DIP_TYPE_AVI0x82
-#define DIP_VERSION_AVI 0x2
-#define DIP_LEN_AVI 13
-#define DIP_AVI_PR_10
-#define DIP_AVI_PR_21
-#define DIP_AVI_RGB_QUANT_RANGE_DEFAULT(0 << 2)
-#define DIP_AVI_RGB_QUANT_RANGE_LIMITED(1 << 2)
-#define DIP_AVI_RGB_QUANT_RANGE_FULL   (2 << 2)
-
-#define DIP_TYPE_SPD   0x83
-#define DIP_VERSION_SPD0x1
-#define DIP_LEN_SPD25
-#define DIP_SPD_UNKNOWN0
-#define DIP_SPD_DSTB   0x1
-#define DIP_SPD_DVDP   0x2
-#define DIP_SPD_DVHS   0x3
-#define DIP_SPD_HDDVR  0x4
-#define DIP_SPD_DVC0x5
-#define DIP_SPD_DSC0x6
-#define DIP_SPD_VCD0x7
-#define DIP_SPD_GAME   0x8
-#define DIP_SPD_PC 0x9
-#define DIP_SPD_BD 0xa
-#define DIP_SPD_SCD0xb
-
-struct dip_infoframe {
-   uint8_t type;   /* HB0 */
-   uint8_t ver;/* HB1 */
-   uint8_t len;/* HB2 - body len, not including checksum */
-   uint8_t ecc;/* Header ECC */
-   uint8_t checksum;   /* PB0 */
-   union {
-   struct {
-   /* PB1 - Y 6:5, A 4:4, B 3:2, S 1:0 */
-   uint8_t Y_A_B_S;
-   /* PB2 - C 7:6, M 5:4, R 3:0 */
-   uint8_t C_M_R;
-   /* PB3 - ITC 7:7, EC 6:4, Q 3:2, SC 1:0 */
-   uint8_t ITC_EC_Q_SC;
-   /* PB4 - VIC 6:0 */
-   uint8_t VIC;
-   /* PB5 - YQ 7:6, CN 5:4, PR 3:0 */
-   uint8_t YQ_CN_PR;
-   /* PB6 to PB13 */
-   uint16_t top_bar_end;
-   uint16_t bottom_bar_start;
-   uint16_t left_bar_end;
-   uint16_t right_bar_start;
-   } __attribute__ ((packed)) avi;
-   struct {
-   uint8_t vn[8];
-   uint8_t pd[16];
-   uint8_t sdi;
-   } __attribute__ ((packed)) spd;
-   uint8_t payload[27];
-   } __attribute__ ((packed)) body;
-} __attribute__((packed));
-
 struct intel_hdmi {
u32 hdmi_reg;
int ddc_bus;
@@ -567,7 +507,6 @@ extern void intel_hdmi_init_connector(struct 
intel_digital_port *intel_dig_port,
 extern struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder);
 extern bool intel_hdmi_compute_config(struct intel_encoder *encoder,
  struct intel_crtc_config *pipe_config);
-extern void intel_dip_infoframe_csum(struct dip_infoframe *avi_if);
 extern bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg,
bool is_sdvob);
 extern void intel_dvo_init(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index 455dfa7..8abb61a 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -67,21 +67,6 @@ static struct intel_hdmi *intel_attached_hdmi(struct 
drm_connector *connector)
return enc_to_intel_hdmi(&intel_attached_encoder(connector)->base);
 }
 
-void intel_dip_infoframe_csum(struct dip_infoframe *frame)
-{
-   uint8_t *data = (uint8_t *)frame;
-   uint8_t sum = 0;
-   unsigned i;
-
-   frame->checksum = 0;
-   frame->ecc = 0;
-
-   for (i = 0; i < frame->len + DIP_HEADER_SIZE; i++)
-   sum += data[i];
-
-   frame->checksum = 0x100 - sum;
-}
-
 static u32 g4x_infoframe_index(enum hdmi_infoframe_type type)
 {
switch (type) {
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 10/12] drm: Handle the DBLCLK flag in the common infoframe helper

2013-08-06 Thread Damien Lespiau
Suggested-by: Ville Syrjälä 
Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c| 3 +++
 drivers/gpu/drm/i915/intel_hdmi.c | 3 ---
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 8d1139f..a9c8980 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3102,6 +3102,9 @@ drm_hdmi_avi_infoframe_from_display_mode(struct 
hdmi_avi_infoframe *frame,
if (err < 0)
return err;
 
+   if (mode->flags & DRM_MODE_FLAG_DBLCLK)
+   frame->pixel_repeat = 1;
+
frame->video_code = drm_match_cea_mode(mode);
if (!frame->video_code)
return 0;
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index 8abb61a..80fbe2d 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -364,9 +364,6 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder 
*encoder,
return;
}
 
-   if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
-   frame.avi.pixel_repeat = 1;
-
if (intel_hdmi->rgb_quant_range_selectable) {
if (intel_crtc->config.limited_color_range)
frame.avi.quantization_range =
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [Intel-gfx] [PATCH 04/12] video/hmdi: Clear the whole incoming buffer, not just the infoframe size

2013-08-07 Thread Damien Lespiau
On Wed, Aug 07, 2013 at 01:56:58PM +0300, Ville Syrjälä wrote:
> On Tue, Aug 06, 2013 at 08:32:16PM +0100, Damien Lespiau wrote:
> > If the user if this API is providing a bigger buffer than the infoframe
> > size, it could be for a could reason. For instance it could be because
> > it gives the buffer that will be written to the hardware, up to the
> > maximum of an infoframe size.
> > 
> > Instead of just zeroing up to the infoframe size, let's zero the whole
> > incoming buffer as those extra bytes are also used to compute the
> > ECC and need to be 0.
> > 
> > Signed-off-by: Damien Lespiau 
> 
> One concern that came to mind was someone needing to preserve the buffer
> contents beyond the infoframe. But I guess if someone really needs to
> do that, they can go and figure out the exact length of the infoframe
> and pass that.

Right, that was my thinking as well. We even have a macro for that now.

-- 
Damien
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


Some edid-decode patches

2013-08-07 Thread Damien Lespiau
A bit more context than the previous patch that was a bit alone. This series
parses yet a bit more of the EDID:
  - The HDMI VICs in the HDMI vendor specific block (HDMI 1.4, 4k modes)
  - The CEA Video Capability Data Block

It also includes 2 EDIDs of TVs that have those bits.

-- 
Damien

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[edid-decode 1/7] Print the resolutions next to the CEA VICs

2013-08-07 Thread Damien Lespiau
Signed-off-by: Damien Lespiau 
---
 edid-decode.c | 84 +--
 1 file changed, 82 insertions(+), 2 deletions(-)

diff --git a/edid-decode.c b/edid-decode.c
index 9840db6..7515181 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -32,6 +32,8 @@
 #include 
 #include 
 
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
+
 static int claims_one_point_oh = 0;
 static int claims_one_point_two = 0;
 static int claims_one_point_three = 0;
@@ -569,14 +571,92 @@ cea_audio_block(unsigned char *x)
 }
 }
 
+static const char *edid_cea_modes[] = {
+"640x480@60Hz",
+"720x480@60Hz",
+"720x480@60Hz",
+"1280x720@60Hz",
+"1920x1080i@60Hz",
+"1440x480i@60Hz",
+"1440x480i@60Hz",
+"1440x240@60Hz",
+"1440x240@60Hz",
+"2880x480i@60Hz",
+"2880x480i@60Hz"
+"2880x240@60Hz",
+"2880x240@60Hz",
+"1440x480@60Hz",
+"1440x480@60Hz",
+"1920x1080@60Hz",
+"720x576@50Hz",
+"720x576@50Hz",
+"1280x720@50Hz",
+"1920x1080i@50Hz",
+"1440x576i@50Hz",
+"1440x576i@50Hz",
+"1440x288@50Hz",
+"1440x288@50Hz",
+"2880x576i@50Hz",
+"2880x576i@50Hz",
+"2880x288@50Hz",
+"2880x288@50Hz",
+"1440x576@50Hz",
+"1440x576@50Hz",
+"1920x1080@50Hz",
+"1920x1080@24Hz",
+"1920x1080@25Hz",
+"1920x1080@30Hz",
+"2880x480@60Hz",
+"2880x480@60Hz",
+"2880x576@50Hz",
+"2880x576@50Hz",
+"1920x1080i@50Hz",
+"1920x1080i@100Hz",
+"1280x720@100Hz",
+"720x576@100Hz",
+"720x576@100Hz",
+"1440x576@100Hz",
+"1440x576@100Hz",
+"1920x1080i@120Hz",
+"1280x720@120Hz",
+"720x480@120Hz",
+"720x480@120Hz",
+"1440x480i@120Hz",
+"1440x480i@120Hz",
+"720x576@200Hz",
+"720x576@200Hz",
+"1440x576i@200Hz",
+"1440x576i@200Hz",
+"720x480@240Hz",
+"720x480@240Hz",
+"1440x480i@240Hz",
+"1440x480i@240Hz",
+"1280x720@24Hz",
+"1280x720@25Hz",
+"1280x720@30Hz",
+"1920x1080@120Hz",
+"1920x1080@100Hz",
+};
+
 static void
 cea_video_block(unsigned char *x)
 {
 int i;
 int length = x[0] & 0x1f;
 
-for (i = 1; i < length; i++)
-   printf("VIC %02d %s\n", x[i] & 0x7f, x[i] & 0x80 ? "(native)" : "");
+for (i = 1; i < length; i++)  {
+   unsigned char vic = x[i] & 0x7f;
+   unsigned char native = x[i] & 0x80;
+   const char *mode;
+
+   vic--;
+   if (vic < ARRAY_SIZE(edid_cea_modes))
+   mode = edid_cea_modes[vic];
+   else
+   mode = "Unknown mode";
+
+   printf("VIC %02d %s %s\n", vic, mode, native ? "(native)" : "");
+}
 }
 
 static void
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[edid-decode 2/7] Add Skyworth 50E780U 50" edid (4k TV)

2013-08-07 Thread Damien Lespiau
Signed-off-by: Damien Lespiau 
---
 data/skyworth-50e780u-hdmi | Bin 0 -> 256 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 data/skyworth-50e780u-hdmi

diff --git a/data/skyworth-50e780u-hdmi b/data/skyworth-50e780u-hdmi
new file mode 100644
index 
..b618a6ff5efbbe15141183266d961ba2c48dfd0c
GIT binary patch
literal 256
zcmZSh4+adr<%|rB3=9l1VvNiUHcAy-yeAigyU$P;^6=UJo`De^$TAcKUXWAB(+Fia
z(x=G4Ajc@%AWAOR)-?WZ{b

literal 0
HcmV?d1

-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[edid-decode 3/7] Decode HDMI 1.4 4k VICs

2013-08-07 Thread Damien Lespiau
Signed-off-by: Damien Lespiau 
---
 edid-decode.c | 15 +--
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/edid-decode.c b/edid-decode.c
index 7515181..55e48a7 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -705,7 +705,7 @@ cea_hdmi_block(unsigned char *x)

if (x[8] & 0x20) {
int mask = 0, formats = 0;
-   int len_xx, len_3d;
+   int len_vic, len_3d;
printf("Extended HDMI video details:\n");
if (x[9 + b] & 0x80)
printf("  3D present\n");
@@ -730,14 +730,17 @@ cea_hdmi_block(unsigned char *x)
printf("  Base EDID image size is in units of 5cm\n");
break;
}
-   len_xx = (x[10 + b] & 0xe0) >> 5;
+   len_vic = (x[10 + b] & 0xe0) >> 5;
len_3d = (x[10 + b] & 0x1f) >> 0;
b += 2;
 
-   if (len_xx) {
-   printf("  Skipping %d bytes that HDMI refuses to publicly"
-  " document\n", len_xx);
-   b += len_xx;
+   if (len_vic) {
+   int i;
+
+   for (i = 0; i < len_vic; i++)
+   printf("  HDMI VIC %d\n", x[9 + b + i]);
+
+   b += len_vic;
}
 
if (len_3d) {
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[edid-decode 4/7] Print the HDMI resolution next to the HDMI VICs

2013-08-07 Thread Damien Lespiau
Signed-off-by: Damien Lespiau 
---
 edid-decode.c | 21 +++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/edid-decode.c b/edid-decode.c
index 55e48a7..5061228 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -659,6 +659,13 @@ cea_video_block(unsigned char *x)
 }
 }
 
+static const char *edid_cea_hdmi_modes[] = {
+"3840x2160@30Hz",
+"3840x2160@25Hz",
+"3840x2160@24Hz",
+"4096x2160@24Hz",
+};
+
 static void
 cea_hdmi_block(unsigned char *x)
 {
@@ -737,8 +744,18 @@ cea_hdmi_block(unsigned char *x)
if (len_vic) {
int i;
 
-   for (i = 0; i < len_vic; i++)
-   printf("  HDMI VIC %d\n", x[9 + b + i]);
+   for (i = 0; i < len_vic; i++) {
+unsigned char vic = x[9 + b + i];
+const char *mode;
+
+vic--;
+if (vic < ARRAY_SIZE(edid_cea_hdmi_modes))
+mode = edid_cea_hdmi_modes[vic];
+else
+mode = "Unknown mode";
+
+   printf("  HDMI VIC %d %s\n", vic, mode);
+}
 
b += len_vic;
}
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[edid-decode 5/7] Add the EDID of a Samsung TV that has a VCDB

2013-08-07 Thread Damien Lespiau
---
 data/samsung-UE40D8000YU-hmdi | Bin 0 -> 256 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 data/samsung-UE40D8000YU-hmdi

diff --git a/data/samsung-UE40D8000YU-hmdi b/data/samsung-UE40D8000YU-hmdi
new file mode 100644
index 
..ba87cb02837173ede00d01206808dd4705eff699
GIT binary patch
literal 256
zcmZSh4+acAx<}a=85kJ!L>QSHB8@7z-c4K_;xki?KOki9`-VdQMutX*#)hd3Q~5VD
ztaM&rWmjxkU`qOp}-6(0u=qrAmJ?)D9*s800uyjKMcW+
zzQLh>?hqly2qtEukKPmHS%g_dn1vJ+m6SQz*_(k5dBni~n3b8ah?$4MfnkTP!UYaS
z2X=dhfC&qLc3&t0+AW~t+5oYeQI=s(&;>b#9U7qyFcF{{88HO`9aV^$c|g0dferx8
CDLnxI

literal 0
HcmV?d1

-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[edid-decode 6/7] Add a small framework to decode fields generically

2013-08-07 Thread Damien Lespiau
Signed-off-by: Damien Lespiau 
---
 edid-decode.c | 69 +--
 1 file changed, 67 insertions(+), 2 deletions(-)

diff --git a/edid-decode.c b/edid-decode.c
index 5061228..7aed3c6 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -32,8 +32,6 @@
 #include 
 #include 
 
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
-
 static int claims_one_point_oh = 0;
 static int claims_one_point_two = 0;
 static int claims_one_point_three = 0;
@@ -65,6 +63,73 @@ static int warning_zero_preferred_refresh = 0;
 
 static int conformant = 1;
 
+struct value {
+int value;
+const char *description;
+};
+
+struct field {
+const char *name;
+int start, end;
+struct value *values;
+int n_values;
+};
+
+#define DEFINE_FIELD(n, var, s, e, ...)\
+static struct value var##_values[] =  {\
+__VA_ARGS__\
+}; \
+static struct field var = {\
+.name = n, \
+.start = s,\
+.end = e,  \
+.values = var##_values,\
+.n_values = ARRAY_SIZE(var##_values),  \
+}
+
+static void
+decode_value(struct field *field, int val, const char *prefix)
+{
+struct value *v;
+int i;
+
+for (i = 0; i < field->n_values; i++) {
+v = &field->values[i];
+
+if (v->value == val)
+   break;
+}
+
+if (i == field->n_values) {
+   printf("%s%s: %d\n", prefix, field->name, val);
+   return;
+}
+
+printf("%s%s: %s (%d)\n", prefix, field->name, v->description, val);
+}
+
+static void
+_decode(struct field **fields, int n_fields, int data, const char *prefix)
+{
+int i;
+
+for (i = 0; i < n_fields; i++) {
+   struct field *f = fields[i];
+   int field_length = f->end - f->start + 1;
+   int val;
+
+if (field_length == 32)
+val = data;
+else
+val = (data >> f->start) & ((1 << field_length) - 1);
+
+decode_value(f, val, prefix);
+}
+}
+
+#define decode(fields, data, prefix)\
+_decode(fields, ARRAY_SIZE(fields), data, prefix)
+
 static char *manufacturer_name(unsigned char *x)
 {
 static char name[4];
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[edid-decode 7/7] Decode the Video Capability Data Block

2013-08-07 Thread Damien Lespiau
Signed-off-by: Damien Lespiau 
---
 edid-decode.c | 39 +++
 1 file changed, 39 insertions(+)

diff --git a/edid-decode.c b/edid-decode.c
index 7aed3c6..58297c9 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -861,6 +861,44 @@ cea_hdmi_block(unsigned char *x)
 }
 }
 
+DEFINE_FIELD("YCbCr quantization", YCbCr_quantization, 7, 7,
+ { 0, "No Data" },
+ { 1, "Selectable (via AVI YQ)" });
+DEFINE_FIELD("RGB quantization", RGB_quantization, 6, 6,
+ { 0, "No Data" },
+ { 1, "Selectable (via AVI Q)" });
+DEFINE_FIELD("PT scan behaviour", PT_scan, 4, 5,
+ { 0, "No Data" },
+ { 1, "Always Overscannned" },
+ { 2, "Always Underscanned" },
+ { 3, "Support both over- and underscan" });
+DEFINE_FIELD("IT scan behaviour", IT_scan, 2, 3,
+ { 0, "IT video formats not supported" },
+ { 1, "Always Overscannned" },
+ { 2, "Always Underscanned" },
+ { 3, "Support both over- and underscan" });
+DEFINE_FIELD("CE scan behaviour", CE_scan, 0, 1,
+ { 0, "CE video formats not supported" },
+ { 1, "Always Overscannned" },
+ { 2, "Always Underscanned" },
+ { 3, "Support both over- and underscan" });
+
+static struct field *vcdb_fields[] = {
+&YCbCr_quantization,
+&RGB_quantization,
+&PT_scan,
+&IT_scan,
+&CE_scan,
+};
+
+static void
+cea_vcdb(unsigned char *x)
+{
+unsigned char d = x[2];
+
+decode(vcdb_fields, d, "");
+}
+
 static void
 cea_block(unsigned char *x)
 {
@@ -895,6 +933,7 @@ cea_block(unsigned char *x)
switch (x[1]) {
case 0x00:
printf("video capability data block\n");
+   cea_vcdb(x);
break;
case 0x01:
printf("vendor-specific video data block\n");
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[edid-decode] Add a small framework to decode fields generically

2013-08-07 Thread Damien Lespiau
v2: Fix rebase fail that removed a necessary hunk

Signed-off-by: Damien Lespiau 
---
 edid-decode.c | 67 +++
 1 file changed, 67 insertions(+)

diff --git a/edid-decode.c b/edid-decode.c
index 5061228..083ddd9 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -65,6 +65,73 @@ static int warning_zero_preferred_refresh = 0;
 
 static int conformant = 1;
 
+struct value {
+int value;
+const char *description;
+};
+
+struct field {
+const char *name;
+int start, end;
+struct value *values;
+int n_values;
+};
+
+#define DEFINE_FIELD(n, var, s, e, ...)\
+static struct value var##_values[] =  {\
+__VA_ARGS__\
+}; \
+static struct field var = {\
+.name = n, \
+.start = s,\
+.end = e,  \
+.values = var##_values,\
+.n_values = ARRAY_SIZE(var##_values),  \
+}
+
+static void
+decode_value(struct field *field, int val, const char *prefix)
+{
+struct value *v;
+int i;
+
+for (i = 0; i < field->n_values; i++) {
+v = &field->values[i];
+
+if (v->value == val)
+   break;
+}
+
+if (i == field->n_values) {
+   printf("%s%s: %d\n", prefix, field->name, val);
+   return;
+}
+
+printf("%s%s: %s (%d)\n", prefix, field->name, v->description, val);
+}
+
+static void
+_decode(struct field **fields, int n_fields, int data, const char *prefix)
+{
+int i;
+
+for (i = 0; i < n_fields; i++) {
+   struct field *f = fields[i];
+   int field_length = f->end - f->start + 1;
+   int val;
+
+if (field_length == 32)
+val = data;
+else
+val = (data >> f->start) & ((1 << field_length) - 1);
+
+decode_value(f, val, prefix);
+}
+}
+
+#define decode(fields, data, prefix)\
+_decode(fields, ARRAY_SIZE(fields), data, prefix)
+
 static char *manufacturer_name(unsigned char *x)
 {
 static char name[4];
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


HDMI 4k support

2013-08-07 Thread Damien Lespiau
This series parses one of the dark corners of the EDID to expose "4k x 2k"
modes to userspace. Those modes are part of HDMI 1.4.

To complete the 4k HDMI support, one needs:

  * Hardware able to output a 300 MHz TMDS clock (Haswell can do that) and
Daniel's patch to bump that limit in the kernel (already queued).

  Author: Daniel Vetter 
  Date:   Mon Jul 22 18:02:39 2013 +0200

  drm/i915: fix hdmi portclock limits

  * The 2 patches attached here to parse the HDMI VICs in the HDMI vendor
specific CEA block.

  * A DDX patch (for UXA) already merged (and in 2.21.14)

  Author: Damien Lespiau 
  Date:   Wed Jul 31 18:50:51 2013 +0100

  uxa/display: Keep the EDID blob around for the lifetime of an output

  * My "Use the TMDS maximum frequency to check mode dot clock" xserver series:

http://lists.x.org/archives/xorg-devel/2013-August/037297.html

The bug referencing all that and the testing by QA:

  https://bugs.freedesktop.org/show_bug.cgi?id=67030

Additionally, edid-decode has been taught about those modes as well:

  http://lists.freedesktop.org/archives/dri-devel/2013-August/043078.html

-- 
Damien
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 1/2] drm/edid: Fix add_cea_modes() style issues

2013-08-07 Thread Damien Lespiau
A few styles issues have creept in here, fix them before touching this
code again.

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 95d6f4b..51342c4 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2442,10 +2442,10 @@ add_alternate_cea_modes(struct drm_connector 
*connector, struct edid *edid)
 }
 
 static int
-do_cea_modes (struct drm_connector *connector, u8 *db, u8 len)
+do_cea_modes(struct drm_connector *connector, u8 *db, u8 len)
 {
struct drm_device *dev = connector->dev;
-   u8 * mode, cea_mode;
+   u8 *mode, cea_mode;
int modes = 0;
 
for (mode = db; mode < db + len; mode++) {
@@ -2502,8 +2502,8 @@ cea_db_offsets(const u8 *cea, int *start, int *end)
 static int
 add_cea_modes(struct drm_connector *connector, struct edid *edid)
 {
-   u8 * cea = drm_find_cea_extension(edid);
-   u8 * db, dbl;
+   u8 *cea = drm_find_cea_extension(edid);
+   u8 *db, dbl;
int modes = 0;
 
if (cea && cea_revision(cea) >= 3) {
@@ -2517,7 +2517,7 @@ add_cea_modes(struct drm_connector *connector, struct 
edid *edid)
dbl = cea_db_payload_len(db);
 
if (cea_db_tag(db) == VIDEO_BLOCK)
-   modes += do_cea_modes (connector, db+1, dbl);
+   modes += do_cea_modes(connector, db + 1, dbl);
}
}
 
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 2/2] drm/edid: Parse the HDMI CEA block and look for 4k modes

2013-08-07 Thread Damien Lespiau
HDMI 1.4 adds 4 "4k x 2k" modes in the the CEA vendor specific block.

With this commit, we now parse this block and expose the 4k modes that
we find there.

Signed-off-by: Damien Lespiau 
Tested-by: Cancan Feng 
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=67030
---
 drivers/gpu/drm/drm_edid.c | 115 +++--
 1 file changed, 100 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 51342c4..b43d64f 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -931,6 +931,36 @@ static const struct drm_display_mode edid_cea_modes[] = {
 .vrefresh = 100, },
 };
 
+/*
+ * HDMI 1.4 4k modes.
+ */
+static const struct drm_display_mode edid_4k_modes[] = {
+   /* 1 - 3840x2160@30Hz */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  3840, 4016, 4104, 4400, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 30, },
+   /* 2 - 3840x2160@25Hz */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  3840, 4896, 4984, 5280, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 25, },
+   /* 3 - 3840x2160@24Hz */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  3840, 5116, 5204, 5500, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 24, },
+   /* 4 - 4096x2160@24Hz (SMPTE) */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  4096, 5116, 5204, 5500, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 24, },
+};
+
 /*** DDC fetch and block validation ***/
 
 static const u8 edid_header[] = {
@@ -2465,6 +2495,59 @@ do_cea_modes(struct drm_connector *connector, u8 *db, u8 
len)
return modes;
 }
 
+static int do_hdmi_vsdb_modes(struct drm_connector *connector, u8 *db, u8 len)
+{
+   struct drm_device *dev = connector->dev;
+   int modes = 0, offset = 0, i;
+   u8 vic_len;
+
+   if (len < 8)
+   goto out;
+
+   /* no HDMI_Video_Present */
+   if (!(db[8] & (1 << 5)))
+   goto out;
+
+   /* Latency_Fields_Present */
+   if (db[8] & (1 << 7))
+   offset += 2;
+
+   /* I_Latency_Fields_Present */
+   if (db[8] & (1 << 6))
+   offset += 2;
+
+   /* the declared length is not long enough for the 2 first bytes
+* of additional video format capabilities */
+   if (len < (10 + offset))
+   goto out;
+
+   vic_len =  db[10 + offset] >> 5;
+   offset += 2;
+
+   for (i = 0; i < vic_len && len >= (9 + offset + i); i++) {
+   struct drm_display_mode *newmode;
+   u8 vic;
+
+   vic = db[9 + offset + i];
+
+   vic--; /* VICs start at 1 */
+   if (vic >= ARRAY_SIZE(edid_4k_modes)) {
+   DRM_ERROR("Unknow HDMI VIC: %d\n", vic);
+   continue;
+   }
+
+   newmode = drm_mode_duplicate(dev, &edid_4k_modes[vic]);
+   if (!newmode)
+   continue;
+
+   drm_mode_probed_add(connector, newmode);
+   modes++;
+   }
+
+out:
+   return modes;
+}
+
 static int
 cea_db_payload_len(const u8 *db)
 {
@@ -2496,6 +2579,21 @@ cea_db_offsets(const u8 *cea, int *start, int *end)
return 0;
 }
 
+static bool cea_db_is_hdmi_vsdb(const u8 *db)
+{
+   int hdmi_id;
+
+   if (cea_db_tag(db) != VENDOR_BLOCK)
+   return false;
+
+   if (cea_db_payload_len(db) < 5)
+   return false;
+
+   hdmi_id = db[1] | (db[2] << 8) | (db[3] << 16);
+
+   return hdmi_id == HDMI_IDENTIFIER;
+}
+
 #define for_each_cea_db(cea, i, start, end) \
for ((i) = (start); (i) < (end) && (i) + 
cea_db_payload_len(&(cea)[(i)]) < (end); (i) += cea_db_payload_len(&(cea)[(i)]) 
+ 1)
 
@@ -2518,6 +2616,8 @@ add_cea_modes(struct drm_connector *connector, struct 
edid *edid)
 
if (cea_db_tag(db) == VIDEO_BLOCK)
modes += do_cea_modes(connector, db + 1, dbl);
+   else if (cea_db_is_hdmi_vsdb(db))
+   modes += do_hdmi_vsdb_modes(connector, db, dbl);
}
}
 
@@ -2570,21 +2670,6 @@ monitor_name(struct detailed_timing *t, void *data)
*(u8 **)data = t->data.other_data.data.str.str;
 }
 
-static bool cea_db_is_hdmi_vsdb(const u8 *db)
-{
-

HDMI 4k support v2

2013-08-13 Thread Damien Lespiau
Following up the first instance of this series:
  http://lists.freedesktop.org/archives/dri-devel/2013-August/043125.html

Here is a v2 with Ville's review pass and a few additions:
  - Alternate clock modes for 4k resolutions
  - HDMI vendor specific infoframe support in drivers/video/hdmi.c
  - Enabling of those vendor specific infoframes in the i915 driver

Along the way, a tegra patch was needed for a small consolidation of the code
packing vendor specific infoframes. This patch has only been compile-tested.

On Intel, it's possible to read back the programmed infoframe buffers with
intel-gpu-tools' intel_infoframe and this gives:

Vendor InfoFrame:
- frequency: every vsync
- raw:
  f4050181 000c0347 0320 
     
  004c   
     
- vendor Id: 0x000c03 (HDMI)
- video format: 0x001 
- HDMI VIC: 3

after a $ xrandr --output HDMI1 --mode 3840x2160 -r 24

-- 
Damien

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 01/12] drm: Don't export drm_find_cea_extension() any more

2013-08-13 Thread Damien Lespiau
This function is only used inside drm_edid.c.

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c | 5 ++---
 include/drm/drm_crtc.h | 1 -
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index dfc7a1b..e014785 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2298,10 +2298,10 @@ add_detailed_modes(struct drm_connector *connector, 
struct edid *edid,
 #define EDID_CEA_YCRCB422  (1 << 4)
 #define EDID_CEA_VCDB_QS   (1 << 6)
 
-/**
+/*
  * Search EDID for CEA extension block.
  */
-u8 *drm_find_cea_extension(struct edid *edid)
+static u8 *drm_find_cea_extension(struct edid *edid)
 {
u8 *edid_ext = NULL;
int i;
@@ -2322,7 +2322,6 @@ u8 *drm_find_cea_extension(struct edid *edid)
 
return edid_ext;
 }
-EXPORT_SYMBOL(drm_find_cea_extension);
 
 /*
  * Calculate the alternate clock for the CEA mode
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index fa12a2f..f3ecc6f 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1050,7 +1050,6 @@ extern int drm_mode_gamma_get_ioctl(struct drm_device 
*dev,
void *data, struct drm_file *file_priv);
 extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
void *data, struct drm_file *file_priv);
-extern u8 *drm_find_cea_extension(struct edid *edid);
 extern u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
 extern bool drm_detect_hdmi_monitor(struct edid *edid);
 extern bool drm_detect_monitor_audio(struct edid *edid);
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 02/12] drm/edid: Fix add_cea_modes() style issues

2013-08-13 Thread Damien Lespiau
A few styles issues have crept in here, fix them before touching this
code again.

v2: constify arguments that can be (Ville Syrjälä)

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c | 15 ---
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index e014785..9e9b6ed 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2301,7 +2301,7 @@ add_detailed_modes(struct drm_connector *connector, 
struct edid *edid,
 /*
  * Search EDID for CEA extension block.
  */
-static u8 *drm_find_cea_extension(struct edid *edid)
+static u8 *drm_find_cea_extension(const struct edid *edid)
 {
u8 *edid_ext = NULL;
int i;
@@ -2441,10 +2441,11 @@ add_alternate_cea_modes(struct drm_connector 
*connector, struct edid *edid)
 }
 
 static int
-do_cea_modes (struct drm_connector *connector, u8 *db, u8 len)
+do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len)
 {
struct drm_device *dev = connector->dev;
-   u8 * mode, cea_mode;
+   const u8 *mode;
+   u8 cea_mode;
int modes = 0;
 
for (mode = db; mode < db + len; mode++) {
@@ -2499,10 +2500,10 @@ cea_db_offsets(const u8 *cea, int *start, int *end)
for ((i) = (start); (i) < (end) && (i) + 
cea_db_payload_len(&(cea)[(i)]) < (end); (i) += cea_db_payload_len(&(cea)[(i)]) 
+ 1)
 
 static int
-add_cea_modes(struct drm_connector *connector, struct edid *edid)
+add_cea_modes(struct drm_connector *connector, const struct edid *edid)
 {
-   u8 * cea = drm_find_cea_extension(edid);
-   u8 * db, dbl;
+   u8 *cea = drm_find_cea_extension(edid);
+   u8 *db, dbl;
int modes = 0;
 
if (cea && cea_revision(cea) >= 3) {
@@ -2516,7 +2517,7 @@ add_cea_modes(struct drm_connector *connector, struct 
edid *edid)
dbl = cea_db_payload_len(db);
 
if (cea_db_tag(db) == VIDEO_BLOCK)
-   modes += do_cea_modes (connector, db+1, dbl);
+   modes += do_cea_modes(connector, db + 1, dbl);
}
}
 
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 03/12] drm/edid: Parse the HDMI CEA block and look for 4k modes

2013-08-13 Thread Damien Lespiau
HDMI 1.4 adds 4 "4k x 2k" modes in the the CEA vendor specific block.

With this commit, we now parse this block and expose the 4k modes that
we find there.

v2: Fix the "4096x2160" string (nice catch!), add comments about
do_hdmi_vsdb_modes() arguments and make it clearer that offset is
relative to the end of the required fields of the HDMI VSDB
(Ville Syrjälä)

Signed-off-by: Damien Lespiau 
Tested-by: Cancan Feng 
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=67030
---
 drivers/gpu/drm/drm_edid.c | 124 +++--
 1 file changed, 109 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 9e9b6ed..0faa08e 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -931,6 +931,36 @@ static const struct drm_display_mode edid_cea_modes[] = {
 .vrefresh = 100, },
 };
 
+/*
+ * HDMI 1.4 4k modes.
+ */
+static const struct drm_display_mode edid_4k_modes[] = {
+   /* 1 - 3840x2160@30Hz */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  3840, 4016, 4104, 4400, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 30, },
+   /* 2 - 3840x2160@25Hz */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  3840, 4896, 4984, 5280, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 25, },
+   /* 3 - 3840x2160@24Hz */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  3840, 5116, 5204, 5500, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 24, },
+   /* 4 - 4096x2160@24Hz (SMPTE) */
+   { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  4096, 5116, 5204, 5500, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 24, },
+};
+
 /*** DDC fetch and block validation ***/
 
 static const u8 edid_header[] = {
@@ -2465,6 +2495,68 @@ do_cea_modes(struct drm_connector *connector, const u8 
*db, u8 len)
return modes;
 }
 
+/*
+ * do_hdmi_vsdb_modes - Parse the HDMI Vendor Specific data block
+ * @connector: connector corresponding to the HDMI sink
+ * @db: start of the CEA vendor specific block
+ * @len: length of the CEA block payload, ie. one can access up to db[len]
+ *
+ * Parses the HDMI VSDB looking for modes to add to @connector.
+ */
+static int
+do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len)
+{
+   struct drm_device *dev = connector->dev;
+   int modes = 0, offset = 0, i;
+   u8 vic_len;
+
+   if (len < 8)
+   goto out;
+
+   /* no HDMI_Video_Present */
+   if (!(db[8] & (1 << 5)))
+   goto out;
+
+   /* Latency_Fields_Present */
+   if (db[8] & (1 << 7))
+   offset += 2;
+
+   /* I_Latency_Fields_Present */
+   if (db[8] & (1 << 6))
+   offset += 2;
+
+   /* the declared length is not long enough for the 2 first bytes
+* of additional video format capabilities */
+   offset += 2;
+   if (len < (8 + offset))
+   goto out;
+
+   vic_len = db[8 + offset] >> 5;
+
+   for (i = 0; i < vic_len && len >= (9 + offset + i); i++) {
+   struct drm_display_mode *newmode;
+   u8 vic;
+
+   vic = db[9 + offset + i];
+
+   vic--; /* VICs start at 1 */
+   if (vic >= ARRAY_SIZE(edid_4k_modes)) {
+   DRM_ERROR("Unknow HDMI VIC: %d\n", vic);
+   continue;
+   }
+
+   newmode = drm_mode_duplicate(dev, &edid_4k_modes[vic]);
+   if (!newmode)
+   continue;
+
+   drm_mode_probed_add(connector, newmode);
+   modes++;
+   }
+
+out:
+   return modes;
+}
+
 static int
 cea_db_payload_len(const u8 *db)
 {
@@ -2496,6 +2588,21 @@ cea_db_offsets(const u8 *cea, int *start, int *end)
return 0;
 }
 
+static bool cea_db_is_hdmi_vsdb(const u8 *db)
+{
+   int hdmi_id;
+
+   if (cea_db_tag(db) != VENDOR_BLOCK)
+   return false;
+
+   if (cea_db_payload_len(db) < 5)
+   return false;
+
+   hdmi_id = db[1] | (db[2] << 8) | (db[3] << 16);
+
+   return hdmi_id == HDMI_IDENTIFIER;
+}
+
 #define for_each_cea_db(cea, i, start, end) \
for ((i) = (start); (i) < (end) && (i) + 
cea_db_payload_len(&(cea)[(i)]) < (end); (i) += cea_db_payload_len(&(cea)[(i)]) 
+ 1)
 
@@ -2518,6 +2625,8 @@ add_cea_modes(

[PATCH 04/12] drm: Add support for alternate clocks of 4k modes

2013-08-13 Thread Damien Lespiau
Suggested-by: Ville Syrjälä 
Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c | 68 ++
 1 file changed, 62 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 0faa08e..606335f 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2409,6 +2409,54 @@ u8 drm_match_cea_mode(const struct drm_display_mode 
*to_match)
 }
 EXPORT_SYMBOL(drm_match_cea_mode);
 
+/*
+ * Calculate the alternate clock for HDMI modes (those from the HDMI vendor
+ * specific block).
+ *
+ * It's almost like cea_mode_alternate_clock(), we just need to add an
+ * exception for the VIC 4 mode (4096x2160@24Hz): no alternate clock for this
+ * one.
+ */
+static unsigned int
+hdmi_mode_alternate_clock(const struct drm_display_mode *hdmi_mode)
+{
+   if (hdmi_mode->vdisplay == 4096 && hdmi_mode->hdisplay == 2160)
+   return hdmi_mode->clock;
+
+   return cea_mode_alternate_clock(hdmi_mode);
+}
+
+/*
+ * drm_match_cea_mode - look for a HDMI mode matching given mode
+ * @to_match: display mode
+ *
+ * An HDMI mode is one defined in the HDMI vendor specific block.
+ *
+ * Returns the HDMI Video ID (VIC) of the mode or 0 if it isn't one.
+ */
+static u8 drm_match_hmdi_mode(const struct drm_display_mode *to_match)
+{
+   u8 mode;
+
+   if (!to_match->clock)
+   return 0;
+
+   for (mode = 0; mode < ARRAY_SIZE(edid_4k_modes); mode++) {
+   const struct drm_display_mode *hdmi_mode = &edid_4k_modes[mode];
+   unsigned int clock1, clock2;
+
+   /* Make sure to also match alternate clocks */
+   clock1 = hdmi_mode->clock;
+   clock2 = hdmi_mode_alternate_clock(hdmi_mode);
+
+   if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) ||
+KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) &&
+   drm_mode_equal_no_clocks(to_match, hdmi_mode))
+   return mode + 1;
+   }
+   return 0;
+}
+
 static int
 add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid)
 {
@@ -2426,18 +2474,26 @@ add_alternate_cea_modes(struct drm_connector 
*connector, struct edid *edid)
 * with the alternate clock for certain CEA modes.
 */
list_for_each_entry(mode, &connector->probed_modes, head) {
-   const struct drm_display_mode *cea_mode;
+   const struct drm_display_mode *cea_mode = NULL;
struct drm_display_mode *newmode;
-   u8 cea_mode_idx = drm_match_cea_mode(mode) - 1;
+   u8 mode_idx = drm_match_cea_mode(mode) - 1;
unsigned int clock1, clock2;
 
-   if (cea_mode_idx >= ARRAY_SIZE(edid_cea_modes))
-   continue;
+   if (mode_idx < ARRAY_SIZE(edid_cea_modes)) {
+   cea_mode = &edid_cea_modes[mode_idx];
+   clock2 = cea_mode_alternate_clock(cea_mode);
+   } else {
+   mode_idx = drm_match_hmdi_mode(mode) - 1;
+   if (mode_idx < ARRAY_SIZE(edid_4k_modes)) {
+   cea_mode = &edid_4k_modes[mode_idx];
+   clock2 = hdmi_mode_alternate_clock(cea_mode);
+   }
+   }
 
-   cea_mode = &edid_cea_modes[cea_mode_idx];
+   if (!cea_mode)
+   continue;
 
clock1 = cea_mode->clock;
-   clock2 = cea_mode_alternate_clock(cea_mode);
 
if (clock1 == clock2)
continue;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 05/12] video/hdmi: Don't let the user of this API create invalid infoframes

2013-08-13 Thread Damien Lespiau
To set the active aspect ratio value in the AVI infoframe today, you not
only have to set the active_aspect field, but also the active_info_valid
bit. Out of the 1 user of this API, we had 100% misuse, forgetting the
_valid bit. This was fixed in:

  Author: Damien Lespiau 
  Date:   Tue Aug 6 20:32:17 2013 +0100

  drm: Don't generate invalid AVI infoframes for CEA modes

We can do better and derive the _valid bit from the user wanting to set
the active aspect ratio.

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c | 1 -
 drivers/video/hdmi.c   | 4 +++-
 include/linux/hdmi.h   | 1 -
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 606335f..ec47eb8 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3258,7 +3258,6 @@ drm_hdmi_avi_infoframe_from_display_mode(struct 
hdmi_avi_infoframe *frame,
frame->video_code = drm_match_cea_mode(mode);
 
frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
-   frame->active_info_valid = 1;
frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
 
return 0;
diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index 635d569..e36da36 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -96,7 +96,9 @@ ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe 
*frame, void *buffer,
 
ptr[0] = ((frame->colorspace & 0x3) << 5) | (frame->scan_mode & 0x3);
 
-   if (frame->active_info_valid)
+   /* Data byte 1, bit 4 has to be set if we provide the active format
+* aspect ratio */
+   if (frame->active_aspect & 0xf)
ptr[0] |= BIT(4);
 
if (frame->horizontal_bar_valid)
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index bc6743e..931474c6 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -109,7 +109,6 @@ struct hdmi_avi_infoframe {
unsigned char version;
unsigned char length;
enum hdmi_colorspace colorspace;
-   bool active_info_valid;
bool horizontal_bar_valid;
bool vertical_bar_valid;
enum hdmi_scan_mode scan_mode;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 06/12] video/hdmi: Derive the bar data valid bit from the bar data fields

2013-08-13 Thread Damien Lespiau
Just like:

  Author: Damien Lespiau 
  Date:   Mon Aug 12 11:53:24 2013 +0100

  video/hdmi: Don't let the user of this API create invalid infoframes

But this time for the horizontal/vertical bar data present bits.

Signed-off-by: Damien Lespiau 
---
 drivers/video/hdmi.c | 5 +++--
 include/linux/hdmi.h | 2 --
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index e36da36..ac84215 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -101,10 +101,11 @@ ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe 
*frame, void *buffer,
if (frame->active_aspect & 0xf)
ptr[0] |= BIT(4);
 
-   if (frame->horizontal_bar_valid)
+   /* Bit 3 and 2 indicate if we transmit horizontal/vertical bar data */
+   if (frame->top_bar || frame->bottom_bar)
ptr[0] |= BIT(3);
 
-   if (frame->vertical_bar_valid)
+   if (frame->left_bar || frame->right_bar)
ptr[0] |= BIT(2);
 
ptr[1] = ((frame->colorimetry & 0x3) << 6) |
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index 931474c6..b98340b 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -109,8 +109,6 @@ struct hdmi_avi_infoframe {
unsigned char version;
unsigned char length;
enum hdmi_colorspace colorspace;
-   bool horizontal_bar_valid;
-   bool vertical_bar_valid;
enum hdmi_scan_mode scan_mode;
enum hdmi_colorimetry colorimetry;
enum hdmi_picture_aspect picture_aspect;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 07/12] video/hdmi: Introduce helpers for the HDMI vendor specific infoframe

2013-08-13 Thread Damien Lespiau
Provide the programming model than the other infoframe types.

The generic _pack() function can't handle those yet as we need to move
the vendor OUI in the generic hdmi_vendor_infoframe structure to know
which kind of vendor infoframe we are dealing with.

Signed-off-by: Damien Lespiau 
---
 drivers/video/hdmi.c | 82 
 include/linux/hdmi.h | 25 
 2 files changed, 107 insertions(+)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index ac84215..2059f7b 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -286,6 +286,88 @@ ssize_t hdmi_audio_infoframe_pack(struct 
hdmi_audio_infoframe *frame,
 EXPORT_SYMBOL(hdmi_audio_infoframe_pack);
 
 /**
+ * hdmi_hdmi_infoframe_init() - initialize an HDMI vendor infoframe
+ * @frame: HDMI vendor infoframe
+ *
+ * Returns 0 on success or a negative error code on failure.
+ */
+int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe *frame)
+{
+   memset(frame, 0, sizeof(*frame));
+
+   frame->type = HDMI_INFOFRAME_TYPE_VENDOR;
+   frame->version = 1;
+   frame->length = 5; /* we can hardcode the size for now as we don't
+   support neither 3D_Ext_Data nor 3D_Metadata_* */
+
+   /* 0 is a valid value for s3d_struct, so we use a special "not set"
+* value */
+   frame->s3d_struct = HDMI_3D_STRUCTURE_INVALID;
+
+   return 0;
+}
+EXPORT_SYMBOL(hdmi_hdmi_infoframe_init);
+
+/**
+ * hdmi_hmdi_infoframe_pack() - write a HDMI vendor infoframe to binary buffer
+ * @frame: HDMI infoframe
+ * @buffer: destination buffer
+ * @size: size of buffer
+ *
+ * Packs the information contained in the @frame structure into a binary
+ * representation that can be written into the corresponding controller
+ * registers. Also computes the checksum as required by section 5.3.5 of
+ * the HDMI 1.4 specification.
+ *
+ * Returns the number of bytes packed into the binary buffer or a negative
+ * error code on failure.
+ */
+ssize_t hdmi_hdmi_infoframe_pack(struct hdmi_hdmi_infoframe *frame,
+void *buffer, size_t size)
+{
+   u8 *ptr = buffer;
+   size_t length;
+
+   /* empty info frame */
+   if (frame->vic == 0 && frame->s3d_struct == HDMI_3D_STRUCTURE_INVALID)
+   return -EINVAL;
+
+   /* only one of those can be supplied */
+   if (frame->vic != 0 && frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID)
+   return -EINVAL;
+
+   length = HDMI_INFOFRAME_HEADER_SIZE + frame->length;
+
+   if (size < length)
+   return -ENOSPC;
+
+   memset(buffer, 0, size);
+
+   ptr[0] = frame->type;
+   ptr[1] = frame->version;
+   ptr[2] = frame->length;
+   ptr[3] = 0; /* checksum */
+
+   /* HDMI OUI */
+   ptr[4] = 0x03;
+   ptr[5] = 0x0c;
+   ptr[6] = 0x00;
+
+   if (frame->vic) {
+   ptr[7] = 0x1 << 5;  /* video format */
+   ptr[8] = frame->vic;
+   } else {
+   ptr[7] = 0x2 << 5;  /* video format */
+   ptr[8] = (frame->s3d_struct & 0xf) << 4;
+   }
+
+   hdmi_infoframe_checksum(buffer, length);
+
+   return length;
+}
+EXPORT_SYMBOL(hdmi_hdmi_infoframe_pack);
+
+/**
  * hdmi_vendor_infoframe_pack() - write a HDMI vendor infoframe to binary
  *buffer
  * @frame: HDMI vendor infoframe
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index b98340b..f5098a8 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -234,11 +234,36 @@ struct hdmi_vendor_infoframe {
 ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
   void *buffer, size_t size);
 
+enum hdmi_3d_structure {
+   HDMI_3D_STRUCTURE_INVALID = -1,
+   HDMI_3D_STRUCTURE_FRAME_PACKING = 0,
+   HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE,
+   HDMI_3D_STRUCTURE_LINE_ALTERNATIVE,
+   HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL,
+   HDMI_3D_STRUCTURE_L_DEPTH,
+   HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH,
+   HDMI_3D_STRUCTURE_TOP_BOTTOM,
+   HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF,
+};
+
+struct hdmi_hdmi_infoframe {
+   enum hdmi_infoframe_type type;
+   unsigned char version;
+   unsigned char length;
+   u8 vic;
+   enum hdmi_3d_structure s3d_struct;
+};
+
+int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe *frame);
+ssize_t hdmi_hdmi_infoframe_pack(struct hdmi_hdmi_infoframe *frame,
+void *buffer, size_t size);
+
 union hdmi_infoframe {
struct hdmi_any_infoframe any;
struct hdmi_avi_infoframe avi;
struct hdmi_spd_infoframe spd;
struct hdmi_vendor_infoframe vendor;
+   struct hdmi_hdmi_infoframe hdmi;
struct hdmi_audio_infoframe audio;
 };
 
-- 
1.8.3.1

_

[PATCH 08/12] gpu: host1x: Port the HDMI vendor infoframe code the common helpers

2013-08-13 Thread Damien Lespiau
I just wrote the bits to define and pack HDMI vendor specific infoframe.
Port the host1x driver to use those so I can refactor the infoframe code
a bit more.

Cc: Thierry Reding 
Cc: Terje Bergström 
Cc: linux-te...@vger.kernel.org

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/host1x/drm/hdmi.c | 24 
 1 file changed, 4 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/host1x/drm/hdmi.c b/drivers/gpu/host1x/drm/hdmi.c
index 01097da..b548918 100644
--- a/drivers/gpu/host1x/drm/hdmi.c
+++ b/drivers/gpu/host1x/drm/hdmi.c
@@ -539,7 +539,7 @@ static void tegra_hdmi_setup_audio_infoframe(struct 
tegra_hdmi *hdmi)
 
 static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi)
 {
-   struct hdmi_vendor_infoframe frame;
+   struct hdmi_hdmi_infoframe frame;
unsigned long value;
u8 buffer[10];
ssize_t err;
@@ -551,26 +551,10 @@ static void tegra_hdmi_setup_stereo_infoframe(struct 
tegra_hdmi *hdmi)
return;
}
 
-   memset(&frame, 0, sizeof(frame));
+   hdmi_hdmi_infoframe_init(&frame);
+   frame.s3d_struct = HDMI_3D_STRUCTURE_FRAME_PACKING;
 
-   frame.type = HDMI_INFOFRAME_TYPE_VENDOR;
-   frame.version = 0x01;
-   frame.length = 6;
-
-   frame.data[0] = 0x03; /* regid0 */
-   frame.data[1] = 0x0c; /* regid1 */
-   frame.data[2] = 0x00; /* regid2 */
-   frame.data[3] = 0x02 << 5; /* video format */
-
-   /* TODO: 74 MHz limit? */
-   if (1) {
-   frame.data[4] = 0x00 << 4; /* 3D structure */
-   } else {
-   frame.data[4] = 0x08 << 4; /* 3D structure */
-   frame.data[5] = 0x00 << 4; /* 3D ext. data */
-   }
-
-   err = hdmi_vendor_infoframe_pack(&frame, buffer, sizeof(buffer));
+   err = hdmi_hdmi_infoframe_pack(&frame, buffer, sizeof(buffer));
if (err < 0) {
dev_err(hdmi->dev, "failed to pack vendor infoframe: %zd\n",
err);
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 09/12] drm/edid: Move HDMI_IDENTIFIER to hdmi.h

2013-08-13 Thread Damien Lespiau
We'll need the HDMI OUI for the HDMI vendor infoframe data, so let's
move the DRM one to hdmi.h, might as well use the hdmi header to store
some hdmi defines.

(Note that, in fact, infoframes are part of the CEA-861 standard, and
only the HDMI vendor specific infoframe is special to HDMI, but
details..)

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c | 1 -
 include/linux/hdmi.h   | 1 +
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index ec47eb8..9a07a33 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2317,7 +2317,6 @@ add_detailed_modes(struct drm_connector *connector, 
struct edid *edid,
return closure.modes;
 }
 
-#define HDMI_IDENTIFIER 0x000C03
 #define AUDIO_BLOCK0x01
 #define VIDEO_BLOCK 0x02
 #define VENDOR_BLOCK0x03
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index f5098a8..53bbf0d 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -18,6 +18,7 @@ enum hdmi_infoframe_type {
HDMI_INFOFRAME_TYPE_AUDIO = 0x84,
 };
 
+#define HDMI_IDENTIFIER 0x000c03
 #define HDMI_INFOFRAME_HEADER_SIZE  4
 #define HDMI_AVI_INFOFRAME_SIZE13
 #define HDMI_SPD_INFOFRAME_SIZE25
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 10/12] video/hdmi: Hook the HDMI vendor infoframe with the generic _pack()

2013-08-13 Thread Damien Lespiau
With this last bit, hdmi_infoframe_pack() is now able to pack any
infoframe we support.

At the same time, because it's impractical to make two commits out of
this, we get rid of the version that encourages the open coding of the
vendor infoframe packing. We can do so because the only user of this API
has been ported in:

  Author: Damien Lespiau 
  Date:   Mon Aug 12 18:08:37 2013 +0100

  gpu: host1x: Port the HDMI vendor infoframe code the common helpers

Signed-off-by: Damien Lespiau 
---
 drivers/video/hdmi.c | 45 +
 include/linux/hdmi.h | 24 
 2 files changed, 21 insertions(+), 48 deletions(-)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index 2059f7b..073f005 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -300,6 +300,7 @@ int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe 
*frame)
frame->length = 5; /* we can hardcode the size for now as we don't
support neither 3D_Ext_Data nor 3D_Metadata_* */
 
+   frame->oui = HDMI_IDENTIFIER;
/* 0 is a valid value for s3d_struct, so we use a special "not set"
 * value */
frame->s3d_struct = HDMI_3D_STRUCTURE_INVALID;
@@ -367,46 +368,18 @@ ssize_t hdmi_hdmi_infoframe_pack(struct 
hdmi_hdmi_infoframe *frame,
 }
 EXPORT_SYMBOL(hdmi_hdmi_infoframe_pack);
 
-/**
- * hdmi_vendor_infoframe_pack() - write a HDMI vendor infoframe to binary
- *buffer
- * @frame: HDMI vendor infoframe
- * @buffer: destination buffer
- * @size: size of buffer
- *
- * Packs the information contained in the @frame structure into a binary
- * representation that can be written into the corresponding controller
- * registers. Also computes the checksum as required by section 5.3.5 of
- * the HDMI 1.4 specification.
- *
- * Returns the number of bytes packed into the binary buffer or a negative
- * error code on failure.
+/*
+ * hdmi_vendor_infoframe_pack() - write a vendor infoframe to binary buffer
  */
-ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
-  void *buffer, size_t size)
+static ssize_t hdmi_vendor_infoframe_pack(union hdmi_vendor_infoframe *frame,
+ void *buffer, size_t size)
 {
-   u8 *ptr = buffer;
-   size_t length;
-
-   length = HDMI_INFOFRAME_HEADER_SIZE + frame->length;
-
-   if (size < length)
-   return -ENOSPC;
-
-   memset(buffer, 0, size);
-
-   ptr[0] = frame->type;
-   ptr[1] = frame->version;
-   ptr[2] = frame->length;
-   ptr[3] = 0; /* checksum */
-
-   memcpy(&ptr[HDMI_INFOFRAME_HEADER_SIZE], frame->data, frame->length);
-
-   hdmi_infoframe_checksum(buffer, length);
+   /* we only know about HDMI vendor infoframes */
+   if (frame->any.oui != HDMI_IDENTIFIER)
+   return -EINVAL;
 
-   return length;
+   return hdmi_hdmi_infoframe_pack(&frame->hdmi, buffer, size);
 }
-EXPORT_SYMBOL(hdmi_vendor_infoframe_pack);
 
 /**
  * hdmi_infoframe_pack() - write a HDMI infoframe to binary buffer
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index 53bbf0d..5c572e9 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -225,16 +225,6 @@ int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe 
*frame);
 ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame,
  void *buffer, size_t size);
 
-struct hdmi_vendor_infoframe {
-   enum hdmi_infoframe_type type;
-   unsigned char version;
-   unsigned char length;
-   u8 data[27];
-};
-
-ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
-  void *buffer, size_t size);
-
 enum hdmi_3d_structure {
HDMI_3D_STRUCTURE_INVALID = -1,
HDMI_3D_STRUCTURE_FRAME_PACKING = 0,
@@ -251,6 +241,7 @@ struct hdmi_hdmi_infoframe {
enum hdmi_infoframe_type type;
unsigned char version;
unsigned char length;
+   int oui;
u8 vic;
enum hdmi_3d_structure s3d_struct;
 };
@@ -259,12 +250,21 @@ int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe 
*frame);
 ssize_t hdmi_hdmi_infoframe_pack(struct hdmi_hdmi_infoframe *frame,
 void *buffer, size_t size);
 
+union hdmi_vendor_infoframe {
+   struct {
+   enum hdmi_infoframe_type type;
+   unsigned char version;
+   unsigned char length;
+   int oui;
+   } any;
+   struct hdmi_hdmi_infoframe hdmi;
+};
+
 union hdmi_infoframe {
struct hdmi_any_infoframe any;
struct hdmi_avi_infoframe avi;
struct hdmi_spd_infoframe spd;
-   struct hdmi_vendor_infoframe vendor;
-   struct hdmi_hdmi_infoframe hdmi;
+   union hdmi_vendor_infoframe vend

[PATCH 11/12] drm: Add a helper to forge HDMI vendor infoframes

2013-08-13 Thread Damien Lespiau
This can then be used by DRM drivers to setup their vendor infoframes.

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c | 36 
 include/drm/drm_edid.h |  4 
 2 files changed, 40 insertions(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 9a07a33..83e1202 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3262,3 +3262,39 @@ drm_hdmi_avi_infoframe_from_display_mode(struct 
hdmi_avi_infoframe *frame,
return 0;
 }
 EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
+
+/**
+ * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
+ * data from a DRM display mode
+ * @frame: HDMI vendor infoframe
+ * @mode: DRM display mode
+ *
+ * Note that there's is a need to send HDMI vendor infoframes only when using a
+ * 4k or stereoscopic 3D mode. So when giving any other mode as input this
+ * function will return -EINVAL, error that can be safely ignored.
+ *
+ * Returns 0 on success or a negative error code on failure.
+ */
+int
+drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_hdmi_infoframe *frame,
+   const struct drm_display_mode *mode)
+{
+   int err;
+   u8 vic;
+
+   if (!frame || !mode)
+   return -EINVAL;
+
+   vic = drm_match_hmdi_mode(mode);
+   if (!vic)
+   return -EINVAL;
+
+   err = hdmi_hdmi_infoframe_init(frame);
+   if (err < 0)
+   return err;
+
+   frame->vic = vic;
+
+   return 0;
+}
+EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode);
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index fc481fc..a204e31 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -256,6 +256,7 @@ struct drm_encoder;
 struct drm_connector;
 struct drm_display_mode;
 struct hdmi_avi_infoframe;
+struct hdmi_hdmi_infoframe;
 
 void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid);
 int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads);
@@ -268,5 +269,8 @@ int drm_load_edid_firmware(struct drm_connector *connector);
 int
 drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
 const struct drm_display_mode *mode);
+int
+drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_hdmi_infoframe *frame,
+   const struct drm_display_mode 
*mode);
 
 #endif /* __DRM_EDID_H__ */
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 12/12] drm/i915/hdmi: Write HDMI vendor specific infoframes

2013-08-13 Thread Damien Lespiau
With all the common infoframe bits now in place, we can finally write
the vendor specific infoframes in our driver.

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/i915/i915_reg.h   |  2 ++
 drivers/gpu/drm/i915/intel_hdmi.c | 28 
 2 files changed, 30 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 17f6252..33427fd1 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -4157,6 +4157,8 @@
 _TRANSCODER(trans, HSW_VIDEO_DIP_CTL_A, HSW_VIDEO_DIP_CTL_B)
 #define HSW_TVIDEO_DIP_AVI_DATA(trans) \
 _TRANSCODER(trans, HSW_VIDEO_DIP_AVI_DATA_A, HSW_VIDEO_DIP_AVI_DATA_B)
+#define HSW_TVIDEO_DIP_VS_DATA(trans) \
+_TRANSCODER(trans, HSW_VIDEO_DIP_VS_DATA_A, HSW_VIDEO_DIP_VS_DATA_B)
 #define HSW_TVIDEO_DIP_SPD_DATA(trans) \
 _TRANSCODER(trans, HSW_VIDEO_DIP_SPD_DATA_A, HSW_VIDEO_DIP_SPD_DATA_B)
 #define HSW_TVIDEO_DIP_GCP(trans) \
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index a619d94..4148cc8 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -74,6 +74,8 @@ static u32 g4x_infoframe_index(enum hdmi_infoframe_type type)
return VIDEO_DIP_SELECT_AVI;
case HDMI_INFOFRAME_TYPE_SPD:
return VIDEO_DIP_SELECT_SPD;
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   return VIDEO_DIP_SELECT_VENDOR;
default:
DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
@@ -87,6 +89,8 @@ static u32 g4x_infoframe_enable(enum hdmi_infoframe_type type)
return VIDEO_DIP_ENABLE_AVI;
case HDMI_INFOFRAME_TYPE_SPD:
return VIDEO_DIP_ENABLE_SPD;
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   return VIDEO_DIP_ENABLE_VENDOR;
default:
DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
@@ -100,6 +104,8 @@ static u32 hsw_infoframe_enable(enum hdmi_infoframe_type 
type)
return VIDEO_DIP_ENABLE_AVI_HSW;
case HDMI_INFOFRAME_TYPE_SPD:
return VIDEO_DIP_ENABLE_SPD_HSW;
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   return VIDEO_DIP_ENABLE_VS_HSW;
default:
DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
@@ -114,6 +120,8 @@ static u32 hsw_infoframe_data_reg(enum hdmi_infoframe_type 
type,
return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder);
case HDMI_INFOFRAME_TYPE_SPD:
return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder);
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder);
default:
DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
@@ -392,6 +400,21 @@ static void intel_hdmi_set_spd_infoframe(struct 
drm_encoder *encoder)
intel_write_infoframe(encoder, &frame);
 }
 
+static void
+intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder,
+ struct drm_display_mode *adjusted_mode)
+{
+   union hdmi_infoframe frame;
+   int ret;
+
+   ret = drm_hdmi_vendor_infoframe_from_display_mode(&frame.vendor.hdmi,
+ adjusted_mode);
+   if (ret < 0)
+   return;
+
+   intel_write_infoframe(encoder, &frame);
+}
+
 static void g4x_set_infoframes(struct drm_encoder *encoder,
   struct drm_display_mode *adjusted_mode)
 {
@@ -454,6 +477,7 @@ static void g4x_set_infoframes(struct drm_encoder *encoder,
 
intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
intel_hdmi_set_spd_infoframe(encoder);
+   intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 }
 
 static void ibx_set_infoframes(struct drm_encoder *encoder,
@@ -515,6 +539,7 @@ static void ibx_set_infoframes(struct drm_encoder *encoder,
 
intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
intel_hdmi_set_spd_infoframe(encoder);
+   intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 }
 
 static void cpt_set_infoframes(struct drm_encoder *encoder,
@@ -550,6 +575,7 @@ static void cpt_set_infoframes(struct drm_encoder *encoder,
 
intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
intel_hdmi_set_spd_infoframe(encoder);
+   intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 }
 
 static void vlv_set_infoframes(struct drm_encoder *encoder,
@@ -584,6 +610,7 @@ static void vlv_set_infoframes(struct drm_encoder *encoder,
 
intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
intel_hdmi_set_spd_infoframe(encoder);
+   intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 }
 
 static void hsw_set_infoframes(struct drm_encoder *encoder,
@@ -611,6 +638,7 @@ sta

HDMI 4k support v3

2013-08-14 Thread Damien Lespiau
Follow up on v2:
  http://lists.freedesktop.org/archives/dri-devel/2013-August/043604.html

With the quick and nice reviews from Ville and Simon, it's time for a v3:
  - Fix embarrassing hmdi typo
  - Fix the sending of vendor specific infoframes for side-by-side half modes
  - Smaller changes here and there.

-- 
Damien

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 01/12] drm: Don't export drm_find_cea_extension() any more

2013-08-14 Thread Damien Lespiau
This function is only used inside drm_edid.c.

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 5 ++---
 include/drm/drm_crtc.h | 1 -
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index dfc7a1b..e014785 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2298,10 +2298,10 @@ add_detailed_modes(struct drm_connector *connector, 
struct edid *edid,
 #define EDID_CEA_YCRCB422  (1 << 4)
 #define EDID_CEA_VCDB_QS   (1 << 6)
 
-/**
+/*
  * Search EDID for CEA extension block.
  */
-u8 *drm_find_cea_extension(struct edid *edid)
+static u8 *drm_find_cea_extension(struct edid *edid)
 {
u8 *edid_ext = NULL;
int i;
@@ -2322,7 +2322,6 @@ u8 *drm_find_cea_extension(struct edid *edid)
 
return edid_ext;
 }
-EXPORT_SYMBOL(drm_find_cea_extension);
 
 /*
  * Calculate the alternate clock for the CEA mode
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index fa12a2f..f3ecc6f 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1050,7 +1050,6 @@ extern int drm_mode_gamma_get_ioctl(struct drm_device 
*dev,
void *data, struct drm_file *file_priv);
 extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
void *data, struct drm_file *file_priv);
-extern u8 *drm_find_cea_extension(struct edid *edid);
 extern u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
 extern bool drm_detect_hdmi_monitor(struct edid *edid);
 extern bool drm_detect_monitor_audio(struct edid *edid);
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 02/12] drm/edid: Fix add_cea_modes() style issues

2013-08-14 Thread Damien Lespiau
A few styles issues have crept in here, fix them before touching this
code again.

v2: constify arguments that can be (Ville Syrjälä)
v3: constify, but better (Ville Syrjälä)

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c | 12 +++-
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index e014785..bb25ee2 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2441,10 +2441,11 @@ add_alternate_cea_modes(struct drm_connector 
*connector, struct edid *edid)
 }
 
 static int
-do_cea_modes (struct drm_connector *connector, u8 *db, u8 len)
+do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len)
 {
struct drm_device *dev = connector->dev;
-   u8 * mode, cea_mode;
+   const u8 *mode;
+   u8 cea_mode;
int modes = 0;
 
for (mode = db; mode < db + len; mode++) {
@@ -2501,8 +2502,9 @@ cea_db_offsets(const u8 *cea, int *start, int *end)
 static int
 add_cea_modes(struct drm_connector *connector, struct edid *edid)
 {
-   u8 * cea = drm_find_cea_extension(edid);
-   u8 * db, dbl;
+   const u8 *cea = drm_find_cea_extension(edid);
+   const u8 *db;
+   u8 dbl;
int modes = 0;
 
if (cea && cea_revision(cea) >= 3) {
@@ -2516,7 +2518,7 @@ add_cea_modes(struct drm_connector *connector, struct 
edid *edid)
dbl = cea_db_payload_len(db);
 
if (cea_db_tag(db) == VIDEO_BLOCK)
-   modes += do_cea_modes (connector, db+1, dbl);
+   modes += do_cea_modes(connector, db + 1, dbl);
}
}
 
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 03/12] drm/edid: Parse the HDMI CEA block and look for 4k modes

2013-08-14 Thread Damien Lespiau
HDMI 1.4 adds 4 "4k x 2k" modes in the the CEA vendor specific block.

With this commit, we now parse this block and expose the 4k modes that
we find there.

v2: Fix the "4096x2160" string (nice catch!), add comments about
do_hdmi_vsdb_modes() arguments and make it clearer that offset is
relative to the end of the required fields of the HDMI VSDB
(Ville Syrjälä)

v3: Fix 'Unknow' typo (Simon Farnsworth)

Signed-off-by: Damien Lespiau 
Tested-by: Cancan Feng 
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=67030
Reviewed-by: Simon Farnsworth 
---
 drivers/gpu/drm/drm_edid.c | 124 +++--
 1 file changed, 109 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index bb25ee2..9de573c 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -931,6 +931,36 @@ static const struct drm_display_mode edid_cea_modes[] = {
 .vrefresh = 100, },
 };
 
+/*
+ * HDMI 1.4 4k modes.
+ */
+static const struct drm_display_mode edid_4k_modes[] = {
+   /* 1 - 3840x2160@30Hz */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  3840, 4016, 4104, 4400, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 30, },
+   /* 2 - 3840x2160@25Hz */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  3840, 4896, 4984, 5280, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 25, },
+   /* 3 - 3840x2160@24Hz */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  3840, 5116, 5204, 5500, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 24, },
+   /* 4 - 4096x2160@24Hz (SMPTE) */
+   { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  4096, 5116, 5204, 5500, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 24, },
+};
+
 /*** DDC fetch and block validation ***/
 
 static const u8 edid_header[] = {
@@ -2465,6 +2495,68 @@ do_cea_modes(struct drm_connector *connector, const u8 
*db, u8 len)
return modes;
 }
 
+/*
+ * do_hdmi_vsdb_modes - Parse the HDMI Vendor Specific data block
+ * @connector: connector corresponding to the HDMI sink
+ * @db: start of the CEA vendor specific block
+ * @len: length of the CEA block payload, ie. one can access up to db[len]
+ *
+ * Parses the HDMI VSDB looking for modes to add to @connector.
+ */
+static int
+do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len)
+{
+   struct drm_device *dev = connector->dev;
+   int modes = 0, offset = 0, i;
+   u8 vic_len;
+
+   if (len < 8)
+   goto out;
+
+   /* no HDMI_Video_Present */
+   if (!(db[8] & (1 << 5)))
+   goto out;
+
+   /* Latency_Fields_Present */
+   if (db[8] & (1 << 7))
+   offset += 2;
+
+   /* I_Latency_Fields_Present */
+   if (db[8] & (1 << 6))
+   offset += 2;
+
+   /* the declared length is not long enough for the 2 first bytes
+* of additional video format capabilities */
+   offset += 2;
+   if (len < (8 + offset))
+   goto out;
+
+   vic_len = db[8 + offset] >> 5;
+
+   for (i = 0; i < vic_len && len >= (9 + offset + i); i++) {
+   struct drm_display_mode *newmode;
+   u8 vic;
+
+   vic = db[9 + offset + i];
+
+   vic--; /* VICs start at 1 */
+   if (vic >= ARRAY_SIZE(edid_4k_modes)) {
+   DRM_ERROR("Unknown HDMI VIC: %d\n", vic);
+   continue;
+   }
+
+   newmode = drm_mode_duplicate(dev, &edid_4k_modes[vic]);
+   if (!newmode)
+   continue;
+
+   drm_mode_probed_add(connector, newmode);
+   modes++;
+   }
+
+out:
+   return modes;
+}
+
 static int
 cea_db_payload_len(const u8 *db)
 {
@@ -2496,6 +2588,21 @@ cea_db_offsets(const u8 *cea, int *start, int *end)
return 0;
 }
 
+static bool cea_db_is_hdmi_vsdb(const u8 *db)
+{
+   int hdmi_id;
+
+   if (cea_db_tag(db) != VENDOR_BLOCK)
+   return false;
+
+   if (cea_db_payload_len(db) < 5)
+   return false;
+
+   hdmi_id = db[1] | (db[2] << 8) | (db[3] << 16);
+
+   return hdmi_id == HDMI_IDENTIFIER;
+}
+
 #define for_each_cea_db(cea, i, start, end) \
for ((i) = (start); (i) < (end) && (i) + 
cea_db_payload_len(&(cea)[(i)]) < (end); 

[PATCH 04/12] drm: Add support for alternate clocks of 4k modes

2013-08-14 Thread Damien Lespiau
v2: Fix hmdi typo (Simon Farnsworth, Ville Syrjälä)

Suggested-by: Ville Syrjälä 
Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
Reviewed-by: Simon Farnsworth 
---
 drivers/gpu/drm/drm_edid.c | 68 ++
 1 file changed, 62 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 9de573c..2381abd 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2409,6 +2409,54 @@ u8 drm_match_cea_mode(const struct drm_display_mode 
*to_match)
 }
 EXPORT_SYMBOL(drm_match_cea_mode);
 
+/*
+ * Calculate the alternate clock for HDMI modes (those from the HDMI vendor
+ * specific block).
+ *
+ * It's almost like cea_mode_alternate_clock(), we just need to add an
+ * exception for the VIC 4 mode (4096x2160@24Hz): no alternate clock for this
+ * one.
+ */
+static unsigned int
+hdmi_mode_alternate_clock(const struct drm_display_mode *hdmi_mode)
+{
+   if (hdmi_mode->vdisplay == 4096 && hdmi_mode->hdisplay == 2160)
+   return hdmi_mode->clock;
+
+   return cea_mode_alternate_clock(hdmi_mode);
+}
+
+/*
+ * drm_match_hdmi_mode - look for a HDMI mode matching given mode
+ * @to_match: display mode
+ *
+ * An HDMI mode is one defined in the HDMI vendor specific block.
+ *
+ * Returns the HDMI Video ID (VIC) of the mode or 0 if it isn't one.
+ */
+static u8 drm_match_hdmi_mode(const struct drm_display_mode *to_match)
+{
+   u8 mode;
+
+   if (!to_match->clock)
+   return 0;
+
+   for (mode = 0; mode < ARRAY_SIZE(edid_4k_modes); mode++) {
+   const struct drm_display_mode *hdmi_mode = &edid_4k_modes[mode];
+   unsigned int clock1, clock2;
+
+   /* Make sure to also match alternate clocks */
+   clock1 = hdmi_mode->clock;
+   clock2 = hdmi_mode_alternate_clock(hdmi_mode);
+
+   if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) ||
+KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) &&
+   drm_mode_equal_no_clocks(to_match, hdmi_mode))
+   return mode + 1;
+   }
+   return 0;
+}
+
 static int
 add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid)
 {
@@ -2426,18 +2474,26 @@ add_alternate_cea_modes(struct drm_connector 
*connector, struct edid *edid)
 * with the alternate clock for certain CEA modes.
 */
list_for_each_entry(mode, &connector->probed_modes, head) {
-   const struct drm_display_mode *cea_mode;
+   const struct drm_display_mode *cea_mode = NULL;
struct drm_display_mode *newmode;
-   u8 cea_mode_idx = drm_match_cea_mode(mode) - 1;
+   u8 mode_idx = drm_match_cea_mode(mode) - 1;
unsigned int clock1, clock2;
 
-   if (cea_mode_idx >= ARRAY_SIZE(edid_cea_modes))
-   continue;
+   if (mode_idx < ARRAY_SIZE(edid_cea_modes)) {
+   cea_mode = &edid_cea_modes[mode_idx];
+   clock2 = cea_mode_alternate_clock(cea_mode);
+   } else {
+   mode_idx = drm_match_hdmi_mode(mode) - 1;
+   if (mode_idx < ARRAY_SIZE(edid_4k_modes)) {
+   cea_mode = &edid_4k_modes[mode_idx];
+   clock2 = hdmi_mode_alternate_clock(cea_mode);
+   }
+   }
 
-   cea_mode = &edid_cea_modes[cea_mode_idx];
+   if (!cea_mode)
+   continue;
 
clock1 = cea_mode->clock;
-   clock2 = cea_mode_alternate_clock(cea_mode);
 
if (clock1 == clock2)
continue;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 05/12] video/hdmi: Don't let the user of this API create invalid infoframes

2013-08-14 Thread Damien Lespiau
To set the active aspect ratio value in the AVI infoframe today, you not
only have to set the active_aspect field, but also the active_info_valid
bit. Out of the 1 user of this API, we had 100% misuse, forgetting the
_valid bit. This was fixed in:

  Author: Damien Lespiau 
  Date:   Tue Aug 6 20:32:17 2013 +0100

  drm: Don't generate invalid AVI infoframes for CEA modes

We can do better and derive the _valid bit from the user wanting to set
the active aspect ratio.

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 1 -
 drivers/video/hdmi.c   | 4 +++-
 include/linux/hdmi.h   | 1 -
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 2381abd..d76d608 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3259,7 +3259,6 @@ drm_hdmi_avi_infoframe_from_display_mode(struct 
hdmi_avi_infoframe *frame,
frame->video_code = drm_match_cea_mode(mode);
 
frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
-   frame->active_info_valid = 1;
frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
 
return 0;
diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index 635d569..e36da36 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -96,7 +96,9 @@ ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe 
*frame, void *buffer,
 
ptr[0] = ((frame->colorspace & 0x3) << 5) | (frame->scan_mode & 0x3);
 
-   if (frame->active_info_valid)
+   /* Data byte 1, bit 4 has to be set if we provide the active format
+* aspect ratio */
+   if (frame->active_aspect & 0xf)
ptr[0] |= BIT(4);
 
if (frame->horizontal_bar_valid)
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index bc6743e..931474c6 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -109,7 +109,6 @@ struct hdmi_avi_infoframe {
unsigned char version;
unsigned char length;
enum hdmi_colorspace colorspace;
-   bool active_info_valid;
bool horizontal_bar_valid;
bool vertical_bar_valid;
enum hdmi_scan_mode scan_mode;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 06/12] video/hdmi: Derive the bar data valid bit from the bar data fields

2013-08-14 Thread Damien Lespiau
Just like:

  Author: Damien Lespiau 
  Date:   Mon Aug 12 11:53:24 2013 +0100

  video/hdmi: Don't let the user of this API create invalid infoframes

But this time for the horizontal/vertical bar data present bits.

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/video/hdmi.c | 5 +++--
 include/linux/hdmi.h | 2 --
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index e36da36..ac84215 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -101,10 +101,11 @@ ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe 
*frame, void *buffer,
if (frame->active_aspect & 0xf)
ptr[0] |= BIT(4);
 
-   if (frame->horizontal_bar_valid)
+   /* Bit 3 and 2 indicate if we transmit horizontal/vertical bar data */
+   if (frame->top_bar || frame->bottom_bar)
ptr[0] |= BIT(3);
 
-   if (frame->vertical_bar_valid)
+   if (frame->left_bar || frame->right_bar)
ptr[0] |= BIT(2);
 
ptr[1] = ((frame->colorimetry & 0x3) << 6) |
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index 931474c6..b98340b 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -109,8 +109,6 @@ struct hdmi_avi_infoframe {
unsigned char version;
unsigned char length;
enum hdmi_colorspace colorspace;
-   bool horizontal_bar_valid;
-   bool vertical_bar_valid;
enum hdmi_scan_mode scan_mode;
enum hdmi_colorimetry colorimetry;
enum hdmi_picture_aspect picture_aspect;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 08/12] gpu: host1x: Port the HDMI vendor infoframe code the common helpers

2013-08-14 Thread Damien Lespiau
I just wrote the bits to define and pack HDMI vendor specific infoframe.
Port the host1x driver to use those so I can refactor the infoframe code
a bit more.

This changes the length of the infoframe payload from 6 to 5, which is
enough for the "frame packing" stereo format.

v2: Pimp up the commit message with the note about the length
(Ville Syrjälä)

Cc: Thierry Reding 
Cc: Terje Bergström 
Cc: linux-te...@vger.kernel.org

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/host1x/drm/hdmi.c | 24 
 1 file changed, 4 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/host1x/drm/hdmi.c b/drivers/gpu/host1x/drm/hdmi.c
index 01097da..b548918 100644
--- a/drivers/gpu/host1x/drm/hdmi.c
+++ b/drivers/gpu/host1x/drm/hdmi.c
@@ -539,7 +539,7 @@ static void tegra_hdmi_setup_audio_infoframe(struct 
tegra_hdmi *hdmi)
 
 static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi)
 {
-   struct hdmi_vendor_infoframe frame;
+   struct hdmi_hdmi_infoframe frame;
unsigned long value;
u8 buffer[10];
ssize_t err;
@@ -551,26 +551,10 @@ static void tegra_hdmi_setup_stereo_infoframe(struct 
tegra_hdmi *hdmi)
return;
}
 
-   memset(&frame, 0, sizeof(frame));
+   hdmi_hdmi_infoframe_init(&frame);
+   frame.s3d_struct = HDMI_3D_STRUCTURE_FRAME_PACKING;
 
-   frame.type = HDMI_INFOFRAME_TYPE_VENDOR;
-   frame.version = 0x01;
-   frame.length = 6;
-
-   frame.data[0] = 0x03; /* regid0 */
-   frame.data[1] = 0x0c; /* regid1 */
-   frame.data[2] = 0x00; /* regid2 */
-   frame.data[3] = 0x02 << 5; /* video format */
-
-   /* TODO: 74 MHz limit? */
-   if (1) {
-   frame.data[4] = 0x00 << 4; /* 3D structure */
-   } else {
-   frame.data[4] = 0x08 << 4; /* 3D structure */
-   frame.data[5] = 0x00 << 4; /* 3D ext. data */
-   }
-
-   err = hdmi_vendor_infoframe_pack(&frame, buffer, sizeof(buffer));
+   err = hdmi_hdmi_infoframe_pack(&frame, buffer, sizeof(buffer));
if (err < 0) {
dev_err(hdmi->dev, "failed to pack vendor infoframe: %zd\n",
err);
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 07/12] video/hdmi: Introduce helpers for the HDMI vendor specific infoframe

2013-08-14 Thread Damien Lespiau
Provide the same programming model than the other infoframe types.

The generic _pack() function can't handle those yet as we need to move
the vendor OUI in the generic hdmi_vendor_infoframe structure to know
which kind of vendor infoframe we are dealing with.

v2: Fix the value of Side-by-side (half), hmdi typo, pack 3D_Ext_Data
(Ville Syrjälä)

Signed-off-by: Damien Lespiau 
---
 drivers/video/hdmi.c | 88 
 include/linux/hdmi.h | 26 
 2 files changed, 114 insertions(+)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index ac84215..59c4748 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -286,6 +286,94 @@ ssize_t hdmi_audio_infoframe_pack(struct 
hdmi_audio_infoframe *frame,
 EXPORT_SYMBOL(hdmi_audio_infoframe_pack);
 
 /**
+ * hdmi_hdmi_infoframe_init() - initialize an HDMI vendor infoframe
+ * @frame: HDMI vendor infoframe
+ *
+ * Returns 0 on success or a negative error code on failure.
+ */
+int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe *frame)
+{
+   memset(frame, 0, sizeof(*frame));
+
+   frame->type = HDMI_INFOFRAME_TYPE_VENDOR;
+   frame->version = 1;
+
+   /* 0 is a valid value for s3d_struct, so we use a special "not set"
+* value */
+   frame->s3d_struct = HDMI_3D_STRUCTURE_INVALID;
+
+   return 0;
+}
+EXPORT_SYMBOL(hdmi_hdmi_infoframe_init);
+
+/**
+ * hdmi_hdmi_infoframe_pack() - write a HDMI vendor infoframe to binary buffer
+ * @frame: HDMI infoframe
+ * @buffer: destination buffer
+ * @size: size of buffer
+ *
+ * Packs the information contained in the @frame structure into a binary
+ * representation that can be written into the corresponding controller
+ * registers. Also computes the checksum as required by section 5.3.5 of
+ * the HDMI 1.4 specification.
+ *
+ * Returns the number of bytes packed into the binary buffer or a negative
+ * error code on failure.
+ */
+ssize_t hdmi_hdmi_infoframe_pack(struct hdmi_hdmi_infoframe *frame,
+void *buffer, size_t size)
+{
+   u8 *ptr = buffer;
+   size_t length;
+
+   /* empty info frame */
+   if (frame->vic == 0 && frame->s3d_struct == HDMI_3D_STRUCTURE_INVALID)
+   return -EINVAL;
+
+   /* only one of those can be supplied */
+   if (frame->vic != 0 && frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID)
+   return -EINVAL;
+
+   /* for side by side (half) we also need to provide 3D_Ext_Data */
+   if (frame->s3d_struct == HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
+   frame->length = 6;
+   else
+   frame->length = 5;
+
+   length = HDMI_INFOFRAME_HEADER_SIZE + frame->length;
+
+   if (size < length)
+   return -ENOSPC;
+
+   memset(buffer, 0, size);
+
+   ptr[0] = frame->type;
+   ptr[1] = frame->version;
+   ptr[2] = frame->length;
+   ptr[3] = 0; /* checksum */
+
+   /* HDMI OUI */
+   ptr[4] = 0x03;
+   ptr[5] = 0x0c;
+   ptr[6] = 0x00;
+
+   if (frame->vic) {
+   ptr[7] = 0x1 << 5;  /* video format */
+   ptr[8] = frame->vic;
+   } else {
+   ptr[7] = 0x2 << 5;  /* video format */
+   ptr[8] = (frame->s3d_struct & 0xf) << 4;
+   if (frame->s3d_struct == HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
+   ptr[9] = (frame->s3d_ext_data & 0xf) << 4;
+   }
+
+   hdmi_infoframe_checksum(buffer, length);
+
+   return length;
+}
+EXPORT_SYMBOL(hdmi_hdmi_infoframe_pack);
+
+/**
  * hdmi_vendor_infoframe_pack() - write a HDMI vendor infoframe to binary
  *buffer
  * @frame: HDMI vendor infoframe
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index b98340b..e733252 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -234,11 +234,37 @@ struct hdmi_vendor_infoframe {
 ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
   void *buffer, size_t size);
 
+enum hdmi_3d_structure {
+   HDMI_3D_STRUCTURE_INVALID = -1,
+   HDMI_3D_STRUCTURE_FRAME_PACKING = 0,
+   HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE,
+   HDMI_3D_STRUCTURE_LINE_ALTERNATIVE,
+   HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL,
+   HDMI_3D_STRUCTURE_L_DEPTH,
+   HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH,
+   HDMI_3D_STRUCTURE_TOP_AND_BOTTOM,
+   HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF = 8,
+};
+
+struct hdmi_hdmi_infoframe {
+   enum hdmi_infoframe_type type;
+   unsigned char version;
+   unsigned char length;
+   u8 vic;
+   enum hdmi_3d_structure s3d_struct;
+   unsigned int s3d_ext_data;
+};
+
+int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe *frame);
+ssize_t hdmi_hdmi_infoframe_pack(struct hdmi_hdmi_infoframe *frame,
+

[PATCH 10/12] video/hdmi: Hook the HDMI vendor infoframe with the generic _pack()

2013-08-14 Thread Damien Lespiau
With this last bit, hdmi_infoframe_pack() is now able to pack any
infoframe we support.

At the same time, because it's impractical to make two commits out of
this, we get rid of the version that encourages the open coding of the
vendor infoframe packing. We can do so because the only user of this API
has been ported in:

  Author: Damien Lespiau 
  Date:   Mon Aug 12 18:08:37 2013 +0100

  gpu: host1x: Port the HDMI vendor infoframe code the common helpers

v2: Change oui to be an unsigned int (Ville Syrjälä)

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/video/hdmi.c | 45 +
 include/linux/hdmi.h | 24 
 2 files changed, 21 insertions(+), 48 deletions(-)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index 59c4748..7ae4f80 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -298,6 +298,7 @@ int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe 
*frame)
frame->type = HDMI_INFOFRAME_TYPE_VENDOR;
frame->version = 1;
 
+   frame->oui = HDMI_IDENTIFIER;
/* 0 is a valid value for s3d_struct, so we use a special "not set"
 * value */
frame->s3d_struct = HDMI_3D_STRUCTURE_INVALID;
@@ -373,46 +374,18 @@ ssize_t hdmi_hdmi_infoframe_pack(struct 
hdmi_hdmi_infoframe *frame,
 }
 EXPORT_SYMBOL(hdmi_hdmi_infoframe_pack);
 
-/**
- * hdmi_vendor_infoframe_pack() - write a HDMI vendor infoframe to binary
- *buffer
- * @frame: HDMI vendor infoframe
- * @buffer: destination buffer
- * @size: size of buffer
- *
- * Packs the information contained in the @frame structure into a binary
- * representation that can be written into the corresponding controller
- * registers. Also computes the checksum as required by section 5.3.5 of
- * the HDMI 1.4 specification.
- *
- * Returns the number of bytes packed into the binary buffer or a negative
- * error code on failure.
+/*
+ * hdmi_vendor_infoframe_pack() - write a vendor infoframe to binary buffer
  */
-ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
-  void *buffer, size_t size)
+static ssize_t hdmi_vendor_infoframe_pack(union hdmi_vendor_infoframe *frame,
+ void *buffer, size_t size)
 {
-   u8 *ptr = buffer;
-   size_t length;
-
-   length = HDMI_INFOFRAME_HEADER_SIZE + frame->length;
-
-   if (size < length)
-   return -ENOSPC;
-
-   memset(buffer, 0, size);
-
-   ptr[0] = frame->type;
-   ptr[1] = frame->version;
-   ptr[2] = frame->length;
-   ptr[3] = 0; /* checksum */
-
-   memcpy(&ptr[HDMI_INFOFRAME_HEADER_SIZE], frame->data, frame->length);
-
-   hdmi_infoframe_checksum(buffer, length);
+   /* we only know about HDMI vendor infoframes */
+   if (frame->any.oui != HDMI_IDENTIFIER)
+   return -EINVAL;
 
-   return length;
+   return hdmi_hdmi_infoframe_pack(&frame->hdmi, buffer, size);
 }
-EXPORT_SYMBOL(hdmi_vendor_infoframe_pack);
 
 /**
  * hdmi_infoframe_pack() - write a HDMI infoframe to binary buffer
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index 37e0cd7..e24d850 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -225,16 +225,6 @@ int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe 
*frame);
 ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame,
  void *buffer, size_t size);
 
-struct hdmi_vendor_infoframe {
-   enum hdmi_infoframe_type type;
-   unsigned char version;
-   unsigned char length;
-   u8 data[27];
-};
-
-ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
-  void *buffer, size_t size);
-
 enum hdmi_3d_structure {
HDMI_3D_STRUCTURE_INVALID = -1,
HDMI_3D_STRUCTURE_FRAME_PACKING = 0,
@@ -251,6 +241,7 @@ struct hdmi_hdmi_infoframe {
enum hdmi_infoframe_type type;
unsigned char version;
unsigned char length;
+   unsigned int oui;
u8 vic;
enum hdmi_3d_structure s3d_struct;
unsigned int s3d_ext_data;
@@ -260,12 +251,21 @@ int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe 
*frame);
 ssize_t hdmi_hdmi_infoframe_pack(struct hdmi_hdmi_infoframe *frame,
 void *buffer, size_t size);
 
+union hdmi_vendor_infoframe {
+   struct {
+   enum hdmi_infoframe_type type;
+   unsigned char version;
+   unsigned char length;
+   unsigned int oui;
+   } any;
+   struct hdmi_hdmi_infoframe hdmi;
+};
+
 union hdmi_infoframe {
struct hdmi_any_infoframe any;
struct hdmi_avi_infoframe avi;
struct hdmi_spd_infoframe spd;
-   struct hdmi_vendor_infoframe vendor;
-   struct hdmi_hdmi_infoframe hd

[PATCH 09/12] drm/edid: Move HDMI_IDENTIFIER to hdmi.h

2013-08-14 Thread Damien Lespiau
We'll need the HDMI OUI for the HDMI vendor infoframe data, so let's
move the DRM one to hdmi.h, might as well use the hdmi header to store
some hdmi defines.

(Note that, in fact, infoframes are part of the CEA-861 standard, and
only the HDMI vendor specific infoframe is special to HDMI, but
details..)

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 1 -
 include/linux/hdmi.h   | 1 +
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index d76d608..3aa653f 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2317,7 +2317,6 @@ add_detailed_modes(struct drm_connector *connector, 
struct edid *edid,
return closure.modes;
 }
 
-#define HDMI_IDENTIFIER 0x000C03
 #define AUDIO_BLOCK0x01
 #define VIDEO_BLOCK 0x02
 #define VENDOR_BLOCK0x03
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index e733252..37e0cd7 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -18,6 +18,7 @@ enum hdmi_infoframe_type {
HDMI_INFOFRAME_TYPE_AUDIO = 0x84,
 };
 
+#define HDMI_IDENTIFIER 0x000c03
 #define HDMI_INFOFRAME_HEADER_SIZE  4
 #define HDMI_AVI_INFOFRAME_SIZE13
 #define HDMI_SPD_INFOFRAME_SIZE25
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 11/12] drm: Add a helper to forge HDMI vendor infoframes

2013-08-14 Thread Damien Lespiau
This can then be used by DRM drivers to setup their vendor infoframes.

v2: Fix hmdi typo (Simon Farnsworth)

Signed-off-by: Damien Lespiau 
Reviewed-by: Simon Farnsworth 
Reviewed-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 36 
 include/drm/drm_edid.h |  4 
 2 files changed, 40 insertions(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 3aa653f..42c62d1 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3263,3 +3263,39 @@ drm_hdmi_avi_infoframe_from_display_mode(struct 
hdmi_avi_infoframe *frame,
return 0;
 }
 EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
+
+/**
+ * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
+ * data from a DRM display mode
+ * @frame: HDMI vendor infoframe
+ * @mode: DRM display mode
+ *
+ * Note that there's is a need to send HDMI vendor infoframes only when using a
+ * 4k or stereoscopic 3D mode. So when giving any other mode as input this
+ * function will return -EINVAL, error that can be safely ignored.
+ *
+ * Returns 0 on success or a negative error code on failure.
+ */
+int
+drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_hdmi_infoframe *frame,
+   const struct drm_display_mode *mode)
+{
+   int err;
+   u8 vic;
+
+   if (!frame || !mode)
+   return -EINVAL;
+
+   vic = drm_match_hdmi_mode(mode);
+   if (!vic)
+   return -EINVAL;
+
+   err = hdmi_hdmi_infoframe_init(frame);
+   if (err < 0)
+   return err;
+
+   frame->vic = vic;
+
+   return 0;
+}
+EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode);
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index fc481fc..a204e31 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -256,6 +256,7 @@ struct drm_encoder;
 struct drm_connector;
 struct drm_display_mode;
 struct hdmi_avi_infoframe;
+struct hdmi_hdmi_infoframe;
 
 void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid);
 int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads);
@@ -268,5 +269,8 @@ int drm_load_edid_firmware(struct drm_connector *connector);
 int
 drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
 const struct drm_display_mode *mode);
+int
+drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_hdmi_infoframe *frame,
+   const struct drm_display_mode 
*mode);
 
 #endif /* __DRM_EDID_H__ */
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 12/12] drm/i915/hdmi: Write HDMI vendor specific infoframes

2013-08-14 Thread Damien Lespiau
With all the common infoframe bits now in place, we can finally write
the vendor specific infoframes in our driver.

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/gpu/drm/i915/i915_reg.h   |  2 ++
 drivers/gpu/drm/i915/intel_hdmi.c | 28 
 2 files changed, 30 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 17f6252..33427fd1 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -4157,6 +4157,8 @@
 _TRANSCODER(trans, HSW_VIDEO_DIP_CTL_A, HSW_VIDEO_DIP_CTL_B)
 #define HSW_TVIDEO_DIP_AVI_DATA(trans) \
 _TRANSCODER(trans, HSW_VIDEO_DIP_AVI_DATA_A, HSW_VIDEO_DIP_AVI_DATA_B)
+#define HSW_TVIDEO_DIP_VS_DATA(trans) \
+_TRANSCODER(trans, HSW_VIDEO_DIP_VS_DATA_A, HSW_VIDEO_DIP_VS_DATA_B)
 #define HSW_TVIDEO_DIP_SPD_DATA(trans) \
 _TRANSCODER(trans, HSW_VIDEO_DIP_SPD_DATA_A, HSW_VIDEO_DIP_SPD_DATA_B)
 #define HSW_TVIDEO_DIP_GCP(trans) \
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index a619d94..4148cc8 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -74,6 +74,8 @@ static u32 g4x_infoframe_index(enum hdmi_infoframe_type type)
return VIDEO_DIP_SELECT_AVI;
case HDMI_INFOFRAME_TYPE_SPD:
return VIDEO_DIP_SELECT_SPD;
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   return VIDEO_DIP_SELECT_VENDOR;
default:
DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
@@ -87,6 +89,8 @@ static u32 g4x_infoframe_enable(enum hdmi_infoframe_type type)
return VIDEO_DIP_ENABLE_AVI;
case HDMI_INFOFRAME_TYPE_SPD:
return VIDEO_DIP_ENABLE_SPD;
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   return VIDEO_DIP_ENABLE_VENDOR;
default:
DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
@@ -100,6 +104,8 @@ static u32 hsw_infoframe_enable(enum hdmi_infoframe_type 
type)
return VIDEO_DIP_ENABLE_AVI_HSW;
case HDMI_INFOFRAME_TYPE_SPD:
return VIDEO_DIP_ENABLE_SPD_HSW;
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   return VIDEO_DIP_ENABLE_VS_HSW;
default:
DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
@@ -114,6 +120,8 @@ static u32 hsw_infoframe_data_reg(enum hdmi_infoframe_type 
type,
return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder);
case HDMI_INFOFRAME_TYPE_SPD:
return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder);
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder);
default:
DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
@@ -392,6 +400,21 @@ static void intel_hdmi_set_spd_infoframe(struct 
drm_encoder *encoder)
intel_write_infoframe(encoder, &frame);
 }
 
+static void
+intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder,
+ struct drm_display_mode *adjusted_mode)
+{
+   union hdmi_infoframe frame;
+   int ret;
+
+   ret = drm_hdmi_vendor_infoframe_from_display_mode(&frame.vendor.hdmi,
+ adjusted_mode);
+   if (ret < 0)
+   return;
+
+   intel_write_infoframe(encoder, &frame);
+}
+
 static void g4x_set_infoframes(struct drm_encoder *encoder,
   struct drm_display_mode *adjusted_mode)
 {
@@ -454,6 +477,7 @@ static void g4x_set_infoframes(struct drm_encoder *encoder,
 
intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
intel_hdmi_set_spd_infoframe(encoder);
+   intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 }
 
 static void ibx_set_infoframes(struct drm_encoder *encoder,
@@ -515,6 +539,7 @@ static void ibx_set_infoframes(struct drm_encoder *encoder,
 
intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
intel_hdmi_set_spd_infoframe(encoder);
+   intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 }
 
 static void cpt_set_infoframes(struct drm_encoder *encoder,
@@ -550,6 +575,7 @@ static void cpt_set_infoframes(struct drm_encoder *encoder,
 
intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
intel_hdmi_set_spd_infoframe(encoder);
+   intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 }
 
 static void vlv_set_infoframes(struct drm_encoder *encoder,
@@ -584,6 +610,7 @@ static void vlv_set_infoframes(struct drm_encoder *encoder,
 
intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
intel_hdmi_set_spd_infoframe(encoder);
+   intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 }
 
 static void hsw_set_infoframes(struct drm_encoder *encoder,
@@

Re: [Intel-gfx] [PATCH] i915: Add a Kconfig option to turn on i915.preliminary_hw_support by default

2013-08-15 Thread Damien Lespiau
On Tue, Aug 13, 2013 at 04:23:17PM -0700, Josh Triplett wrote:
> When building kernels for a preliminary hardware target, having to add a
> kernel command-line option can prove inconvenient.  Add a Kconfig option
> that changes the default of this option to 1.

FWIW, I like it (and had something similar in mind for this on other
little parameters/debug features). 

Reviewed-by: Damien Lespiau 

It doesn't apply cleanly to drm-intel/drm-intel-nightly which is the
preferred branch to base patches on. Daniel might fix this himself as
this is rather trivial to solve.

-- 
Damien

> Signed-off-by: Josh Triplett 
> ---
> 
> I dropped the indication of the default in the module parameter
> documentation, but I could also change it to show the default for the
> current kernel via ifdef.
> 
>  drivers/gpu/drm/Kconfig | 9 +
>  drivers/gpu/drm/i915/i915_drv.c | 4 ++--
>  2 files changed, 11 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
> index a7c54c8..35d57ed 100644
> --- a/drivers/gpu/drm/Kconfig
> +++ b/drivers/gpu/drm/Kconfig
> @@ -168,6 +168,15 @@ config DRM_I915_KMS
> the driver to bind to PCI devices, which precludes loading things
> like intelfb.
>  
> +config DRM_I915_PRELIMINARY_HW_SUPPORT
> + bool "Enable preliminary support for prerelease Intel hardware by 
> default"
> + depends on DRM_I915
> + help
> +   Choose this option if you have prerelease Intel hardware and want the
> +   i915 driver to support it by default.  You can enable such support at
> +   runtime with the module option i915.preliminary_hw_support=1; this
> +   option changes the default for that module option.
> +
>  config DRM_MGA
>   tristate "Matrox g200/g400"
>   depends on DRM && PCI
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 45b3c03..594e06c 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -118,10 +118,10 @@ module_param_named(i915_enable_ppgtt, 
> i915_enable_ppgtt, int, 0600);
>  MODULE_PARM_DESC(i915_enable_ppgtt,
>   "Enable PPGTT (default: true)");
>  
> -unsigned int i915_preliminary_hw_support __read_mostly = 0;
> +unsigned int i915_preliminary_hw_support __read_mostly = 
> IS_ENABLED(CONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT);
>  module_param_named(preliminary_hw_support, i915_preliminary_hw_support, int, 
> 0600);
>  MODULE_PARM_DESC(preliminary_hw_support,
> - "Enable preliminary hardware support. (default: false)");
> + "Enable preliminary hardware support.");
>  
>  int i915_disable_power_well __read_mostly = 1;
>  module_param_named(disable_power_well, i915_disable_power_well, int, 0600);
> -- 
> 1.8.4.rc2
> 
> ___
> Intel-gfx mailing list
> intel-...@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 09/12] drm/edid: Move HDMI_IDENTIFIER to hdmi.h

2013-08-19 Thread Damien Lespiau
On Thu, Aug 15, 2013 at 05:12:00PM +0200, Thierry Reding wrote:
> On Wed, Aug 14, 2013 at 06:19:12PM +0100, Damien Lespiau wrote:
> [...]
> > +#define HDMI_IDENTIFIER 0x000c03
> 
> HDMI_IDENTIFIER sounds really generic. Perhaps HDMI_INFOFRAME_OUI_HDMI?

This identifier is not infoframe specific, it's the IEEE OUI:

  http://standards.ieee.org/develop/regauth/oui/oui.txt

would HDMI_IEEE_OUI suit you?

-- 
Damien
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


HDMI 4k support v4

2013-08-19 Thread Damien Lespiau
Follow up on v3:
  http://lists.freedesktop.org/archives/dri-devel/2013-August/043696.html

Changes between v3 and v4:
  - Future proof the sending of 3D_Ext_Data
  - Renamed struct hdmi_hdmi_infoframe to hdmi_vendor_infoframe (by, in turn,
renaming the hdmi_vendor_infoframe enum to hdmi_vendor_any_infoframe)
  - Renamed HDMI_IDENTIFIER to HDMI_IEEE_OUI

-- 
Damien

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 01/14] drm: Don't export drm_find_cea_extension() any more

2013-08-19 Thread Damien Lespiau
This function is only used inside drm_edid.c.

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 5 ++---
 include/drm/drm_crtc.h | 1 -
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index dfc7a1b..e014785 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2298,10 +2298,10 @@ add_detailed_modes(struct drm_connector *connector, 
struct edid *edid,
 #define EDID_CEA_YCRCB422  (1 << 4)
 #define EDID_CEA_VCDB_QS   (1 << 6)
 
-/**
+/*
  * Search EDID for CEA extension block.
  */
-u8 *drm_find_cea_extension(struct edid *edid)
+static u8 *drm_find_cea_extension(struct edid *edid)
 {
u8 *edid_ext = NULL;
int i;
@@ -2322,7 +2322,6 @@ u8 *drm_find_cea_extension(struct edid *edid)
 
return edid_ext;
 }
-EXPORT_SYMBOL(drm_find_cea_extension);
 
 /*
  * Calculate the alternate clock for the CEA mode
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index fa12a2f..f3ecc6f 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1050,7 +1050,6 @@ extern int drm_mode_gamma_get_ioctl(struct drm_device 
*dev,
void *data, struct drm_file *file_priv);
 extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
void *data, struct drm_file *file_priv);
-extern u8 *drm_find_cea_extension(struct edid *edid);
 extern u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
 extern bool drm_detect_hdmi_monitor(struct edid *edid);
 extern bool drm_detect_monitor_audio(struct edid *edid);
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 02/14] drm/edid: Fix add_cea_modes() style issues

2013-08-19 Thread Damien Lespiau
A few styles issues have crept in here, fix them before touching this
code again.

v2: constify arguments that can be (Ville Syrjälä)
v3: constify, but better (Ville Syrjälä)

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 12 +++-
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index e014785..bb25ee2 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2441,10 +2441,11 @@ add_alternate_cea_modes(struct drm_connector 
*connector, struct edid *edid)
 }
 
 static int
-do_cea_modes (struct drm_connector *connector, u8 *db, u8 len)
+do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len)
 {
struct drm_device *dev = connector->dev;
-   u8 * mode, cea_mode;
+   const u8 *mode;
+   u8 cea_mode;
int modes = 0;
 
for (mode = db; mode < db + len; mode++) {
@@ -2501,8 +2502,9 @@ cea_db_offsets(const u8 *cea, int *start, int *end)
 static int
 add_cea_modes(struct drm_connector *connector, struct edid *edid)
 {
-   u8 * cea = drm_find_cea_extension(edid);
-   u8 * db, dbl;
+   const u8 *cea = drm_find_cea_extension(edid);
+   const u8 *db;
+   u8 dbl;
int modes = 0;
 
if (cea && cea_revision(cea) >= 3) {
@@ -2516,7 +2518,7 @@ add_cea_modes(struct drm_connector *connector, struct 
edid *edid)
dbl = cea_db_payload_len(db);
 
if (cea_db_tag(db) == VIDEO_BLOCK)
-   modes += do_cea_modes (connector, db+1, dbl);
+   modes += do_cea_modes(connector, db + 1, dbl);
}
}
 
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 03/14] drm/edid: Parse the HDMI CEA block and look for 4k modes

2013-08-19 Thread Damien Lespiau
HDMI 1.4 adds 4 "4k x 2k" modes in the the CEA vendor specific block.

With this commit, we now parse this block and expose the 4k modes that
we find there.

v2: Fix the "4096x2160" string (nice catch!), add comments about
do_hdmi_vsdb_modes() arguments and make it clearer that offset is
relative to the end of the required fields of the HDMI VSDB
(Ville Syrjälä)

v3: Fix 'Unknow' typo (Simon Farnsworth)

Signed-off-by: Damien Lespiau 
Tested-by: Cancan Feng 
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=67030
Reviewed-by: Simon Farnsworth 
Reviewed-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 124 +++--
 1 file changed, 109 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index bb25ee2..9de573c 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -931,6 +931,36 @@ static const struct drm_display_mode edid_cea_modes[] = {
 .vrefresh = 100, },
 };
 
+/*
+ * HDMI 1.4 4k modes.
+ */
+static const struct drm_display_mode edid_4k_modes[] = {
+   /* 1 - 3840x2160@30Hz */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  3840, 4016, 4104, 4400, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 30, },
+   /* 2 - 3840x2160@25Hz */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  3840, 4896, 4984, 5280, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 25, },
+   /* 3 - 3840x2160@24Hz */
+   { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  3840, 5116, 5204, 5500, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 24, },
+   /* 4 - 4096x2160@24Hz (SMPTE) */
+   { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000,
+  4096, 5116, 5204, 5500, 0,
+  2160, 2168, 2178, 2250, 0,
+  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
+ .vrefresh = 24, },
+};
+
 /*** DDC fetch and block validation ***/
 
 static const u8 edid_header[] = {
@@ -2465,6 +2495,68 @@ do_cea_modes(struct drm_connector *connector, const u8 
*db, u8 len)
return modes;
 }
 
+/*
+ * do_hdmi_vsdb_modes - Parse the HDMI Vendor Specific data block
+ * @connector: connector corresponding to the HDMI sink
+ * @db: start of the CEA vendor specific block
+ * @len: length of the CEA block payload, ie. one can access up to db[len]
+ *
+ * Parses the HDMI VSDB looking for modes to add to @connector.
+ */
+static int
+do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len)
+{
+   struct drm_device *dev = connector->dev;
+   int modes = 0, offset = 0, i;
+   u8 vic_len;
+
+   if (len < 8)
+   goto out;
+
+   /* no HDMI_Video_Present */
+   if (!(db[8] & (1 << 5)))
+   goto out;
+
+   /* Latency_Fields_Present */
+   if (db[8] & (1 << 7))
+   offset += 2;
+
+   /* I_Latency_Fields_Present */
+   if (db[8] & (1 << 6))
+   offset += 2;
+
+   /* the declared length is not long enough for the 2 first bytes
+* of additional video format capabilities */
+   offset += 2;
+   if (len < (8 + offset))
+   goto out;
+
+   vic_len = db[8 + offset] >> 5;
+
+   for (i = 0; i < vic_len && len >= (9 + offset + i); i++) {
+   struct drm_display_mode *newmode;
+   u8 vic;
+
+   vic = db[9 + offset + i];
+
+   vic--; /* VICs start at 1 */
+   if (vic >= ARRAY_SIZE(edid_4k_modes)) {
+   DRM_ERROR("Unknown HDMI VIC: %d\n", vic);
+   continue;
+   }
+
+   newmode = drm_mode_duplicate(dev, &edid_4k_modes[vic]);
+   if (!newmode)
+   continue;
+
+   drm_mode_probed_add(connector, newmode);
+   modes++;
+   }
+
+out:
+   return modes;
+}
+
 static int
 cea_db_payload_len(const u8 *db)
 {
@@ -2496,6 +2588,21 @@ cea_db_offsets(const u8 *cea, int *start, int *end)
return 0;
 }
 
+static bool cea_db_is_hdmi_vsdb(const u8 *db)
+{
+   int hdmi_id;
+
+   if (cea_db_tag(db) != VENDOR_BLOCK)
+   return false;
+
+   if (cea_db_payload_len(db) < 5)
+   return false;
+
+   hdmi_id = db[1] | (db[2] << 8) | (db[3] << 16);
+
+   return hdmi_id == HDMI_IDENTIFIER;
+}
+
 #define for_each_cea_db(cea, i, start, end) \
for ((i) = (start); (i) < (end) && (i) + 
cea

[PATCH 04/14] drm: Add support for alternate clocks of 4k modes

2013-08-19 Thread Damien Lespiau
v2: Fix hmdi typo (Simon Farnsworth, Ville Syrjälä)

Suggested-by: Ville Syrjälä 
Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
Reviewed-by: Simon Farnsworth 
---
 drivers/gpu/drm/drm_edid.c | 68 ++
 1 file changed, 62 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 9de573c..2381abd 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2409,6 +2409,54 @@ u8 drm_match_cea_mode(const struct drm_display_mode 
*to_match)
 }
 EXPORT_SYMBOL(drm_match_cea_mode);
 
+/*
+ * Calculate the alternate clock for HDMI modes (those from the HDMI vendor
+ * specific block).
+ *
+ * It's almost like cea_mode_alternate_clock(), we just need to add an
+ * exception for the VIC 4 mode (4096x2160@24Hz): no alternate clock for this
+ * one.
+ */
+static unsigned int
+hdmi_mode_alternate_clock(const struct drm_display_mode *hdmi_mode)
+{
+   if (hdmi_mode->vdisplay == 4096 && hdmi_mode->hdisplay == 2160)
+   return hdmi_mode->clock;
+
+   return cea_mode_alternate_clock(hdmi_mode);
+}
+
+/*
+ * drm_match_hdmi_mode - look for a HDMI mode matching given mode
+ * @to_match: display mode
+ *
+ * An HDMI mode is one defined in the HDMI vendor specific block.
+ *
+ * Returns the HDMI Video ID (VIC) of the mode or 0 if it isn't one.
+ */
+static u8 drm_match_hdmi_mode(const struct drm_display_mode *to_match)
+{
+   u8 mode;
+
+   if (!to_match->clock)
+   return 0;
+
+   for (mode = 0; mode < ARRAY_SIZE(edid_4k_modes); mode++) {
+   const struct drm_display_mode *hdmi_mode = &edid_4k_modes[mode];
+   unsigned int clock1, clock2;
+
+   /* Make sure to also match alternate clocks */
+   clock1 = hdmi_mode->clock;
+   clock2 = hdmi_mode_alternate_clock(hdmi_mode);
+
+   if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) ||
+KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) &&
+   drm_mode_equal_no_clocks(to_match, hdmi_mode))
+   return mode + 1;
+   }
+   return 0;
+}
+
 static int
 add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid)
 {
@@ -2426,18 +2474,26 @@ add_alternate_cea_modes(struct drm_connector 
*connector, struct edid *edid)
 * with the alternate clock for certain CEA modes.
 */
list_for_each_entry(mode, &connector->probed_modes, head) {
-   const struct drm_display_mode *cea_mode;
+   const struct drm_display_mode *cea_mode = NULL;
struct drm_display_mode *newmode;
-   u8 cea_mode_idx = drm_match_cea_mode(mode) - 1;
+   u8 mode_idx = drm_match_cea_mode(mode) - 1;
unsigned int clock1, clock2;
 
-   if (cea_mode_idx >= ARRAY_SIZE(edid_cea_modes))
-   continue;
+   if (mode_idx < ARRAY_SIZE(edid_cea_modes)) {
+   cea_mode = &edid_cea_modes[mode_idx];
+   clock2 = cea_mode_alternate_clock(cea_mode);
+   } else {
+   mode_idx = drm_match_hdmi_mode(mode) - 1;
+   if (mode_idx < ARRAY_SIZE(edid_4k_modes)) {
+   cea_mode = &edid_4k_modes[mode_idx];
+   clock2 = hdmi_mode_alternate_clock(cea_mode);
+   }
+   }
 
-   cea_mode = &edid_cea_modes[cea_mode_idx];
+   if (!cea_mode)
+   continue;
 
clock1 = cea_mode->clock;
-   clock2 = cea_mode_alternate_clock(cea_mode);
 
if (clock1 == clock2)
continue;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 05/14] video/hdmi: Don't let the user of this API create invalid infoframes

2013-08-19 Thread Damien Lespiau
To set the active aspect ratio value in the AVI infoframe today, you not
only have to set the active_aspect field, but also the active_info_valid
bit. Out of the 1 user of this API, we had 100% misuse, forgetting the
_valid bit. This was fixed in:

  Author: Damien Lespiau 
  Date:   Tue Aug 6 20:32:17 2013 +0100

  drm: Don't generate invalid AVI infoframes for CEA modes

We can do better and derive the _valid bit from the user wanting to set
the active aspect ratio.

v2: Fix multi-lines comment style (Thierry Reding)

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 1 -
 drivers/video/hdmi.c   | 6 +-
 include/linux/hdmi.h   | 1 -
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 2381abd..d76d608 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3259,7 +3259,6 @@ drm_hdmi_avi_infoframe_from_display_mode(struct 
hdmi_avi_infoframe *frame,
frame->video_code = drm_match_cea_mode(mode);
 
frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
-   frame->active_info_valid = 1;
frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
 
return 0;
diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index 635d569..7ccc118 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -96,7 +96,11 @@ ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe 
*frame, void *buffer,
 
ptr[0] = ((frame->colorspace & 0x3) << 5) | (frame->scan_mode & 0x3);
 
-   if (frame->active_info_valid)
+   /*
+* Data byte 1, bit 4 has to be set if we provide the active format
+* aspect ratio
+*/
+   if (frame->active_aspect & 0xf)
ptr[0] |= BIT(4);
 
if (frame->horizontal_bar_valid)
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index bc6743e..931474c6 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -109,7 +109,6 @@ struct hdmi_avi_infoframe {
unsigned char version;
unsigned char length;
enum hdmi_colorspace colorspace;
-   bool active_info_valid;
bool horizontal_bar_valid;
bool vertical_bar_valid;
enum hdmi_scan_mode scan_mode;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 06/14] video/hdmi: Derive the bar data valid bit from the bar data fields

2013-08-19 Thread Damien Lespiau
Just like:

  Author: Damien Lespiau 
  Date:   Mon Aug 12 11:53:24 2013 +0100

  video/hdmi: Don't let the user of this API create invalid infoframes

But this time for the horizontal/vertical bar data present bits.

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/video/hdmi.c | 5 +++--
 include/linux/hdmi.h | 2 --
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index 7ccc118..1201357 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -103,10 +103,11 @@ ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe 
*frame, void *buffer,
if (frame->active_aspect & 0xf)
ptr[0] |= BIT(4);
 
-   if (frame->horizontal_bar_valid)
+   /* Bit 3 and 2 indicate if we transmit horizontal/vertical bar data */
+   if (frame->top_bar || frame->bottom_bar)
ptr[0] |= BIT(3);
 
-   if (frame->vertical_bar_valid)
+   if (frame->left_bar || frame->right_bar)
ptr[0] |= BIT(2);
 
ptr[1] = ((frame->colorimetry & 0x3) << 6) |
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index 931474c6..b98340b 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -109,8 +109,6 @@ struct hdmi_avi_infoframe {
unsigned char version;
unsigned char length;
enum hdmi_colorspace colorspace;
-   bool horizontal_bar_valid;
-   bool vertical_bar_valid;
enum hdmi_scan_mode scan_mode;
enum hdmi_colorimetry colorimetry;
enum hdmi_picture_aspect picture_aspect;
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 07/14] video/hdmi: Introduce helpers for the HDMI vendor specific infoframe

2013-08-19 Thread Damien Lespiau
Provide the same programming model than the other infoframe types.

The generic _pack() function can't handle those yet as we need to move
the vendor OUI in the generic hdmi_vendor_infoframe structure to know
which kind of vendor infoframe we are dealing with.

v2: Fix the value of Side-by-side (half), hmdi typo, pack 3D_Ext_Data
(Ville Syrjälä)
v3: Future proof the sending of 3D_Ext_Data (Ville Syrjälä), Fix
multi-lines comment style (Thierry Reding)

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/video/hdmi.c | 90 
 include/linux/hdmi.h | 26 +++
 2 files changed, 116 insertions(+)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index 1201357..4c42bcb 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -288,6 +288,96 @@ ssize_t hdmi_audio_infoframe_pack(struct 
hdmi_audio_infoframe *frame,
 EXPORT_SYMBOL(hdmi_audio_infoframe_pack);
 
 /**
+ * hdmi_hdmi_infoframe_init() - initialize an HDMI vendor infoframe
+ * @frame: HDMI vendor infoframe
+ *
+ * Returns 0 on success or a negative error code on failure.
+ */
+int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe *frame)
+{
+   memset(frame, 0, sizeof(*frame));
+
+   frame->type = HDMI_INFOFRAME_TYPE_VENDOR;
+   frame->version = 1;
+
+   /*
+* 0 is a valid value for s3d_struct, so we use a special "not set"
+* value
+*/
+   frame->s3d_struct = HDMI_3D_STRUCTURE_INVALID;
+
+   return 0;
+}
+EXPORT_SYMBOL(hdmi_hdmi_infoframe_init);
+
+/**
+ * hdmi_hdmi_infoframe_pack() - write a HDMI vendor infoframe to binary buffer
+ * @frame: HDMI infoframe
+ * @buffer: destination buffer
+ * @size: size of buffer
+ *
+ * Packs the information contained in the @frame structure into a binary
+ * representation that can be written into the corresponding controller
+ * registers. Also computes the checksum as required by section 5.3.5 of
+ * the HDMI 1.4 specification.
+ *
+ * Returns the number of bytes packed into the binary buffer or a negative
+ * error code on failure.
+ */
+ssize_t hdmi_hdmi_infoframe_pack(struct hdmi_hdmi_infoframe *frame,
+void *buffer, size_t size)
+{
+   u8 *ptr = buffer;
+   size_t length;
+
+   /* empty info frame */
+   if (frame->vic == 0 && frame->s3d_struct == HDMI_3D_STRUCTURE_INVALID)
+   return -EINVAL;
+
+   /* only one of those can be supplied */
+   if (frame->vic != 0 && frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID)
+   return -EINVAL;
+
+   /* for side by side (half) we also need to provide 3D_Ext_Data */
+   if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
+   frame->length = 6;
+   else
+   frame->length = 5;
+
+   length = HDMI_INFOFRAME_HEADER_SIZE + frame->length;
+
+   if (size < length)
+   return -ENOSPC;
+
+   memset(buffer, 0, size);
+
+   ptr[0] = frame->type;
+   ptr[1] = frame->version;
+   ptr[2] = frame->length;
+   ptr[3] = 0; /* checksum */
+
+   /* HDMI OUI */
+   ptr[4] = 0x03;
+   ptr[5] = 0x0c;
+   ptr[6] = 0x00;
+
+   if (frame->vic) {
+   ptr[7] = 0x1 << 5;  /* video format */
+   ptr[8] = frame->vic;
+   } else {
+   ptr[7] = 0x2 << 5;  /* video format */
+   ptr[8] = (frame->s3d_struct & 0xf) << 4;
+   if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
+   ptr[9] = (frame->s3d_ext_data & 0xf) << 4;
+   }
+
+   hdmi_infoframe_checksum(buffer, length);
+
+   return length;
+}
+EXPORT_SYMBOL(hdmi_hdmi_infoframe_pack);
+
+/**
  * hdmi_vendor_infoframe_pack() - write a HDMI vendor infoframe to binary
  *buffer
  * @frame: HDMI vendor infoframe
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index b98340b..e733252 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -234,11 +234,37 @@ struct hdmi_vendor_infoframe {
 ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
   void *buffer, size_t size);
 
+enum hdmi_3d_structure {
+   HDMI_3D_STRUCTURE_INVALID = -1,
+   HDMI_3D_STRUCTURE_FRAME_PACKING = 0,
+   HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE,
+   HDMI_3D_STRUCTURE_LINE_ALTERNATIVE,
+   HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL,
+   HDMI_3D_STRUCTURE_L_DEPTH,
+   HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH,
+   HDMI_3D_STRUCTURE_TOP_AND_BOTTOM,
+   HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF = 8,
+};
+
+struct hdmi_hdmi_infoframe {
+   enum hdmi_infoframe_type type;
+   unsigned char version;
+   unsigned char length;
+   u8 vic;
+   enum hdmi_3d_structure s3d_struct;
+   uns

[PATCH 08/14] gpu: host1x: Port the HDMI vendor infoframe code the common helpers

2013-08-19 Thread Damien Lespiau
I just wrote the bits to define and pack HDMI vendor specific infoframe.
Port the host1x driver to use those so I can refactor the infoframe code
a bit more.

This changes the length of the infoframe payload from 6 to 5, which is
enough for the "frame packing" stereo format.

v2: Pimp up the commit message with the note about the length
(Ville Syrjälä)

Cc: Thierry Reding 
Cc: Terje Bergström 
Cc: linux-te...@vger.kernel.org

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/host1x/drm/hdmi.c | 24 
 1 file changed, 4 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/host1x/drm/hdmi.c b/drivers/gpu/host1x/drm/hdmi.c
index 01097da..b548918 100644
--- a/drivers/gpu/host1x/drm/hdmi.c
+++ b/drivers/gpu/host1x/drm/hdmi.c
@@ -539,7 +539,7 @@ static void tegra_hdmi_setup_audio_infoframe(struct 
tegra_hdmi *hdmi)
 
 static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi)
 {
-   struct hdmi_vendor_infoframe frame;
+   struct hdmi_hdmi_infoframe frame;
unsigned long value;
u8 buffer[10];
ssize_t err;
@@ -551,26 +551,10 @@ static void tegra_hdmi_setup_stereo_infoframe(struct 
tegra_hdmi *hdmi)
return;
}
 
-   memset(&frame, 0, sizeof(frame));
+   hdmi_hdmi_infoframe_init(&frame);
+   frame.s3d_struct = HDMI_3D_STRUCTURE_FRAME_PACKING;
 
-   frame.type = HDMI_INFOFRAME_TYPE_VENDOR;
-   frame.version = 0x01;
-   frame.length = 6;
-
-   frame.data[0] = 0x03; /* regid0 */
-   frame.data[1] = 0x0c; /* regid1 */
-   frame.data[2] = 0x00; /* regid2 */
-   frame.data[3] = 0x02 << 5; /* video format */
-
-   /* TODO: 74 MHz limit? */
-   if (1) {
-   frame.data[4] = 0x00 << 4; /* 3D structure */
-   } else {
-   frame.data[4] = 0x08 << 4; /* 3D structure */
-   frame.data[5] = 0x00 << 4; /* 3D ext. data */
-   }
-
-   err = hdmi_vendor_infoframe_pack(&frame, buffer, sizeof(buffer));
+   err = hdmi_hdmi_infoframe_pack(&frame, buffer, sizeof(buffer));
if (err < 0) {
dev_err(hdmi->dev, "failed to pack vendor infoframe: %zd\n",
err);
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 10/14] video/hdmi: Hook the HDMI vendor infoframe with the generic _pack()

2013-08-19 Thread Damien Lespiau
With this last bit, hdmi_infoframe_pack() is now able to pack any
infoframe we support.

At the same time, because it's impractical to make two commits out of
this, we get rid of the version that encourages the open coding of the
vendor infoframe packing. We can do so because the only user of this API
has been ported in:

  Author: Damien Lespiau 
  Date:   Mon Aug 12 18:08:37 2013 +0100

  gpu: host1x: Port the HDMI vendor infoframe code the common helpers

v2: Change oui to be an unsigned int (Ville Syrjälä)

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/video/hdmi.c | 46 ++
 include/linux/hdmi.h | 24 
 2 files changed, 22 insertions(+), 48 deletions(-)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index 4c42bcb..fbccb88 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -300,6 +300,8 @@ int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe 
*frame)
frame->type = HDMI_INFOFRAME_TYPE_VENDOR;
frame->version = 1;
 
+   frame->oui = HDMI_IDENTIFIER;
+
/*
 * 0 is a valid value for s3d_struct, so we use a special "not set"
 * value
@@ -377,46 +379,18 @@ ssize_t hdmi_hdmi_infoframe_pack(struct 
hdmi_hdmi_infoframe *frame,
 }
 EXPORT_SYMBOL(hdmi_hdmi_infoframe_pack);
 
-/**
- * hdmi_vendor_infoframe_pack() - write a HDMI vendor infoframe to binary
- *buffer
- * @frame: HDMI vendor infoframe
- * @buffer: destination buffer
- * @size: size of buffer
- *
- * Packs the information contained in the @frame structure into a binary
- * representation that can be written into the corresponding controller
- * registers. Also computes the checksum as required by section 5.3.5 of
- * the HDMI 1.4 specification.
- *
- * Returns the number of bytes packed into the binary buffer or a negative
- * error code on failure.
+/*
+ * hdmi_vendor_infoframe_pack() - write a vendor infoframe to binary buffer
  */
-ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
-  void *buffer, size_t size)
+static ssize_t hdmi_vendor_infoframe_pack(union hdmi_vendor_infoframe *frame,
+ void *buffer, size_t size)
 {
-   u8 *ptr = buffer;
-   size_t length;
-
-   length = HDMI_INFOFRAME_HEADER_SIZE + frame->length;
-
-   if (size < length)
-   return -ENOSPC;
-
-   memset(buffer, 0, size);
-
-   ptr[0] = frame->type;
-   ptr[1] = frame->version;
-   ptr[2] = frame->length;
-   ptr[3] = 0; /* checksum */
-
-   memcpy(&ptr[HDMI_INFOFRAME_HEADER_SIZE], frame->data, frame->length);
-
-   hdmi_infoframe_checksum(buffer, length);
+   /* we only know about HDMI vendor infoframes */
+   if (frame->any.oui != HDMI_IDENTIFIER)
+   return -EINVAL;
 
-   return length;
+   return hdmi_hdmi_infoframe_pack(&frame->hdmi, buffer, size);
 }
-EXPORT_SYMBOL(hdmi_vendor_infoframe_pack);
 
 /**
  * hdmi_infoframe_pack() - write a HDMI infoframe to binary buffer
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index 37e0cd7..e24d850 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -225,16 +225,6 @@ int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe 
*frame);
 ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame,
  void *buffer, size_t size);
 
-struct hdmi_vendor_infoframe {
-   enum hdmi_infoframe_type type;
-   unsigned char version;
-   unsigned char length;
-   u8 data[27];
-};
-
-ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
-  void *buffer, size_t size);
-
 enum hdmi_3d_structure {
HDMI_3D_STRUCTURE_INVALID = -1,
HDMI_3D_STRUCTURE_FRAME_PACKING = 0,
@@ -251,6 +241,7 @@ struct hdmi_hdmi_infoframe {
enum hdmi_infoframe_type type;
unsigned char version;
unsigned char length;
+   unsigned int oui;
u8 vic;
enum hdmi_3d_structure s3d_struct;
unsigned int s3d_ext_data;
@@ -260,12 +251,21 @@ int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe 
*frame);
 ssize_t hdmi_hdmi_infoframe_pack(struct hdmi_hdmi_infoframe *frame,
 void *buffer, size_t size);
 
+union hdmi_vendor_infoframe {
+   struct {
+   enum hdmi_infoframe_type type;
+   unsigned char version;
+   unsigned char length;
+   unsigned int oui;
+   } any;
+   struct hdmi_hdmi_infoframe hdmi;
+};
+
 union hdmi_infoframe {
struct hdmi_any_infoframe any;
struct hdmi_avi_infoframe avi;
struct hdmi_spd_infoframe spd;
-   struct hdmi_vendor_infoframe vendor;
-   struct hdmi_hdmi_infoframe hdmi;
+   union hdmi_vendor_infoframe vendor;
 

[PATCH 09/14] drm/edid: Move HDMI_IDENTIFIER to hdmi.h

2013-08-19 Thread Damien Lespiau
We'll need the HDMI OUI for the HDMI vendor infoframe data, so let's
move the DRM one to hdmi.h, might as well use the hdmi header to store
some hdmi defines.

(Note that, in fact, infoframes are part of the CEA-861 standard, and
only the HDMI vendor specific infoframe is special to HDMI, but
details..)

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 1 -
 include/linux/hdmi.h   | 1 +
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index d76d608..3aa653f 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2317,7 +2317,6 @@ add_detailed_modes(struct drm_connector *connector, 
struct edid *edid,
return closure.modes;
 }
 
-#define HDMI_IDENTIFIER 0x000C03
 #define AUDIO_BLOCK0x01
 #define VIDEO_BLOCK 0x02
 #define VENDOR_BLOCK0x03
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index e733252..37e0cd7 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -18,6 +18,7 @@ enum hdmi_infoframe_type {
HDMI_INFOFRAME_TYPE_AUDIO = 0x84,
 };
 
+#define HDMI_IDENTIFIER 0x000c03
 #define HDMI_INFOFRAME_HEADER_SIZE  4
 #define HDMI_AVI_INFOFRAME_SIZE13
 #define HDMI_SPD_INFOFRAME_SIZE25
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 11/14] video/hdmi: Use hdmi_vendor_infoframe for the HDMI specific infoframe

2013-08-19 Thread Damien Lespiau
We just got rid of the version of hdmi_vendor_infoframe that had a byte
array for anyone to poke at. It's now time to shuffle around the naming
of hdmi_hdmi_infoframe to make hdmi_vendor_infoframe become the HDMI
vendor specific structure.

Cc: Thierry Reding 
Signed-off-by: Damien Lespiau 
---
 drivers/gpu/host1x/drm/hdmi.c |  6 +++---
 drivers/video/hdmi.c  | 25 +
 include/linux/hdmi.h  | 15 ---
 3 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/host1x/drm/hdmi.c b/drivers/gpu/host1x/drm/hdmi.c
index b548918..52e3c96 100644
--- a/drivers/gpu/host1x/drm/hdmi.c
+++ b/drivers/gpu/host1x/drm/hdmi.c
@@ -539,7 +539,7 @@ static void tegra_hdmi_setup_audio_infoframe(struct 
tegra_hdmi *hdmi)
 
 static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi)
 {
-   struct hdmi_hdmi_infoframe frame;
+   struct hdmi_vendor_infoframe frame;
unsigned long value;
u8 buffer[10];
ssize_t err;
@@ -551,10 +551,10 @@ static void tegra_hdmi_setup_stereo_infoframe(struct 
tegra_hdmi *hdmi)
return;
}
 
-   hdmi_hdmi_infoframe_init(&frame);
+   hdmi_vendor_infoframe_init(&frame);
frame.s3d_struct = HDMI_3D_STRUCTURE_FRAME_PACKING;
 
-   err = hdmi_hdmi_infoframe_pack(&frame, buffer, sizeof(buffer));
+   err = hdmi_vendor_infoframe_pack(&frame, buffer, sizeof(buffer));
if (err < 0) {
dev_err(hdmi->dev, "failed to pack vendor infoframe: %zd\n",
err);
diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index fbccb88..4f73167 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -288,12 +288,12 @@ ssize_t hdmi_audio_infoframe_pack(struct 
hdmi_audio_infoframe *frame,
 EXPORT_SYMBOL(hdmi_audio_infoframe_pack);
 
 /**
- * hdmi_hdmi_infoframe_init() - initialize an HDMI vendor infoframe
+ * hdmi_vendor_infoframe_init() - initialize an HDMI vendor infoframe
  * @frame: HDMI vendor infoframe
  *
  * Returns 0 on success or a negative error code on failure.
  */
-int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe *frame)
+int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *frame)
 {
memset(frame, 0, sizeof(*frame));
 
@@ -310,10 +310,10 @@ int hdmi_hdmi_infoframe_init(struct hdmi_hdmi_infoframe 
*frame)
 
return 0;
 }
-EXPORT_SYMBOL(hdmi_hdmi_infoframe_init);
+EXPORT_SYMBOL(hdmi_vendor_infoframe_init);
 
 /**
- * hdmi_hdmi_infoframe_pack() - write a HDMI vendor infoframe to binary buffer
+ * hdmi_vendor_infoframe_pack() - write a HDMI vendor infoframe to binary 
buffer
  * @frame: HDMI infoframe
  * @buffer: destination buffer
  * @size: size of buffer
@@ -326,7 +326,7 @@ EXPORT_SYMBOL(hdmi_hdmi_infoframe_init);
  * Returns the number of bytes packed into the binary buffer or a negative
  * error code on failure.
  */
-ssize_t hdmi_hdmi_infoframe_pack(struct hdmi_hdmi_infoframe *frame,
+ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
 void *buffer, size_t size)
 {
u8 *ptr = buffer;
@@ -377,19 +377,20 @@ ssize_t hdmi_hdmi_infoframe_pack(struct 
hdmi_hdmi_infoframe *frame,
 
return length;
 }
-EXPORT_SYMBOL(hdmi_hdmi_infoframe_pack);
+EXPORT_SYMBOL(hdmi_vendor_infoframe_pack);
 
 /*
- * hdmi_vendor_infoframe_pack() - write a vendor infoframe to binary buffer
+ * hdmi_vendor_any_infoframe_pack() - write a vendor infoframe to binary buffer
  */
-static ssize_t hdmi_vendor_infoframe_pack(union hdmi_vendor_infoframe *frame,
- void *buffer, size_t size)
+static ssize_t
+hdmi_vendor_any_infoframe_pack(union hdmi_vendor_any_infoframe *frame,
+  void *buffer, size_t size)
 {
/* we only know about HDMI vendor infoframes */
if (frame->any.oui != HDMI_IDENTIFIER)
return -EINVAL;
 
-   return hdmi_hdmi_infoframe_pack(&frame->hdmi, buffer, size);
+   return hdmi_vendor_infoframe_pack(&frame->hdmi, buffer, size);
 }
 
 /**
@@ -422,8 +423,8 @@ hdmi_infoframe_pack(union hdmi_infoframe *frame, void 
*buffer, size_t size)
length = hdmi_audio_infoframe_pack(&frame->audio, buffer, size);
break;
case HDMI_INFOFRAME_TYPE_VENDOR:
-   length = hdmi_vendor_infoframe_pack(&frame->vendor,
-   buffer, size);
+   length = hdmi_vendor_any_infoframe_pack(&frame->vendor,
+   buffer, size);
break;
default:
WARN(1, "Bad infoframe type %d\n", frame->any.type);
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index e24d850..d4ae12c 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -237,7 +237,8 @@ enum hdmi_3d_structure {
  

[PATCH 12/14] drm: Add a helper to forge HDMI vendor infoframes

2013-08-19 Thread Damien Lespiau
This can then be used by DRM drivers to setup their vendor infoframes.

v2: Fix hmdi typo (Simon Farnsworth)
v3: Adapt to the hdmi_vendor_infoframe rename

Signed-off-by: Damien Lespiau 
Reviewed-by: Simon Farnsworth 
Reviewed-by: Ville Syrjälä 
---
 drivers/gpu/drm/drm_edid.c | 36 
 include/drm/drm_edid.h |  4 
 2 files changed, 40 insertions(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 3aa653f..ed3505f 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3263,3 +3263,39 @@ drm_hdmi_avi_infoframe_from_display_mode(struct 
hdmi_avi_infoframe *frame,
return 0;
 }
 EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
+
+/**
+ * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
+ * data from a DRM display mode
+ * @frame: HDMI vendor infoframe
+ * @mode: DRM display mode
+ *
+ * Note that there's is a need to send HDMI vendor infoframes only when using a
+ * 4k or stereoscopic 3D mode. So when giving any other mode as input this
+ * function will return -EINVAL, error that can be safely ignored.
+ *
+ * Returns 0 on success or a negative error code on failure.
+ */
+int
+drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe 
*frame,
+   const struct drm_display_mode *mode)
+{
+   int err;
+   u8 vic;
+
+   if (!frame || !mode)
+   return -EINVAL;
+
+   vic = drm_match_hdmi_mode(mode);
+   if (!vic)
+   return -EINVAL;
+
+   err = hdmi_vendor_infoframe_init(frame);
+   if (err < 0)
+   return err;
+
+   frame->vic = vic;
+
+   return 0;
+}
+EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode);
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index fc481fc..7b75621 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -256,6 +256,7 @@ struct drm_encoder;
 struct drm_connector;
 struct drm_display_mode;
 struct hdmi_avi_infoframe;
+struct hdmi_vendor_infoframe;
 
 void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid);
 int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads);
@@ -268,5 +269,8 @@ int drm_load_edid_firmware(struct drm_connector *connector);
 int
 drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
 const struct drm_display_mode *mode);
+int
+drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe 
*frame,
+   const struct drm_display_mode 
*mode);
 
 #endif /* __DRM_EDID_H__ */
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 13/14] drm/i915/hdmi: Write HDMI vendor specific infoframes

2013-08-19 Thread Damien Lespiau
With all the common infoframe bits now in place, we can finally write
the vendor specific infoframes in our driver.

Signed-off-by: Damien Lespiau 
Reviewed-by: Ville Syrjälä 
---
 drivers/gpu/drm/i915/i915_reg.h   |  2 ++
 drivers/gpu/drm/i915/intel_hdmi.c | 28 
 2 files changed, 30 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 17f6252..33427fd1 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -4157,6 +4157,8 @@
 _TRANSCODER(trans, HSW_VIDEO_DIP_CTL_A, HSW_VIDEO_DIP_CTL_B)
 #define HSW_TVIDEO_DIP_AVI_DATA(trans) \
 _TRANSCODER(trans, HSW_VIDEO_DIP_AVI_DATA_A, HSW_VIDEO_DIP_AVI_DATA_B)
+#define HSW_TVIDEO_DIP_VS_DATA(trans) \
+_TRANSCODER(trans, HSW_VIDEO_DIP_VS_DATA_A, HSW_VIDEO_DIP_VS_DATA_B)
 #define HSW_TVIDEO_DIP_SPD_DATA(trans) \
 _TRANSCODER(trans, HSW_VIDEO_DIP_SPD_DATA_A, HSW_VIDEO_DIP_SPD_DATA_B)
 #define HSW_TVIDEO_DIP_GCP(trans) \
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index a619d94..4148cc8 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -74,6 +74,8 @@ static u32 g4x_infoframe_index(enum hdmi_infoframe_type type)
return VIDEO_DIP_SELECT_AVI;
case HDMI_INFOFRAME_TYPE_SPD:
return VIDEO_DIP_SELECT_SPD;
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   return VIDEO_DIP_SELECT_VENDOR;
default:
DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
@@ -87,6 +89,8 @@ static u32 g4x_infoframe_enable(enum hdmi_infoframe_type type)
return VIDEO_DIP_ENABLE_AVI;
case HDMI_INFOFRAME_TYPE_SPD:
return VIDEO_DIP_ENABLE_SPD;
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   return VIDEO_DIP_ENABLE_VENDOR;
default:
DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
@@ -100,6 +104,8 @@ static u32 hsw_infoframe_enable(enum hdmi_infoframe_type 
type)
return VIDEO_DIP_ENABLE_AVI_HSW;
case HDMI_INFOFRAME_TYPE_SPD:
return VIDEO_DIP_ENABLE_SPD_HSW;
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   return VIDEO_DIP_ENABLE_VS_HSW;
default:
DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
@@ -114,6 +120,8 @@ static u32 hsw_infoframe_data_reg(enum hdmi_infoframe_type 
type,
return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder);
case HDMI_INFOFRAME_TYPE_SPD:
return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder);
+   case HDMI_INFOFRAME_TYPE_VENDOR:
+   return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder);
default:
DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
return 0;
@@ -392,6 +400,21 @@ static void intel_hdmi_set_spd_infoframe(struct 
drm_encoder *encoder)
intel_write_infoframe(encoder, &frame);
 }
 
+static void
+intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder,
+ struct drm_display_mode *adjusted_mode)
+{
+   union hdmi_infoframe frame;
+   int ret;
+
+   ret = drm_hdmi_vendor_infoframe_from_display_mode(&frame.vendor.hdmi,
+ adjusted_mode);
+   if (ret < 0)
+   return;
+
+   intel_write_infoframe(encoder, &frame);
+}
+
 static void g4x_set_infoframes(struct drm_encoder *encoder,
   struct drm_display_mode *adjusted_mode)
 {
@@ -454,6 +477,7 @@ static void g4x_set_infoframes(struct drm_encoder *encoder,
 
intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
intel_hdmi_set_spd_infoframe(encoder);
+   intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 }
 
 static void ibx_set_infoframes(struct drm_encoder *encoder,
@@ -515,6 +539,7 @@ static void ibx_set_infoframes(struct drm_encoder *encoder,
 
intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
intel_hdmi_set_spd_infoframe(encoder);
+   intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 }
 
 static void cpt_set_infoframes(struct drm_encoder *encoder,
@@ -550,6 +575,7 @@ static void cpt_set_infoframes(struct drm_encoder *encoder,
 
intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
intel_hdmi_set_spd_infoframe(encoder);
+   intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 }
 
 static void vlv_set_infoframes(struct drm_encoder *encoder,
@@ -584,6 +610,7 @@ static void vlv_set_infoframes(struct drm_encoder *encoder,
 
intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
intel_hdmi_set_spd_infoframe(encoder);
+   intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 }
 
 static void hsw_set_infoframes(struct drm_encoder *encoder,
@@

[PATCH 14/14] video/hdmi: Rename HDMI_IDENTIFIER to HDMI_IEEE_OUI

2013-08-19 Thread Damien Lespiau
HDMI_IDENTIFIER was felt too generic, rename it to what it is, the IEEE
OUI corresponding to HDMI Licensing, LLC.

http://standards.ieee.org/develop/regauth/oui/oui.txt

Cc: Thierry Reding 
Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_edid.c | 2 +-
 drivers/video/hdmi.c   | 4 ++--
 include/linux/hdmi.h   | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index ed3505f..a207cc3 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2655,7 +2655,7 @@ static bool cea_db_is_hdmi_vsdb(const u8 *db)
 
hdmi_id = db[1] | (db[2] << 8) | (db[3] << 16);
 
-   return hdmi_id == HDMI_IDENTIFIER;
+   return hdmi_id == HDMI_IEEE_OUI;
 }
 
 #define for_each_cea_db(cea, i, start, end) \
diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index 4f73167..9e758a8 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -300,7 +300,7 @@ int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe 
*frame)
frame->type = HDMI_INFOFRAME_TYPE_VENDOR;
frame->version = 1;
 
-   frame->oui = HDMI_IDENTIFIER;
+   frame->oui = HDMI_IEEE_OUI;
 
/*
 * 0 is a valid value for s3d_struct, so we use a special "not set"
@@ -387,7 +387,7 @@ hdmi_vendor_any_infoframe_pack(union 
hdmi_vendor_any_infoframe *frame,
   void *buffer, size_t size)
 {
/* we only know about HDMI vendor infoframes */
-   if (frame->any.oui != HDMI_IDENTIFIER)
+   if (frame->any.oui != HDMI_IEEE_OUI)
return -EINVAL;
 
return hdmi_vendor_infoframe_pack(&frame->hdmi, buffer, size);
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index d4ae12c..9231be9 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -18,7 +18,7 @@ enum hdmi_infoframe_type {
HDMI_INFOFRAME_TYPE_AUDIO = 0x84,
 };
 
-#define HDMI_IDENTIFIER 0x000c03
+#define HDMI_IEEE_OUI 0x000c03
 #define HDMI_INFOFRAME_HEADER_SIZE  4
 #define HDMI_AVI_INFOFRAME_SIZE13
 #define HDMI_SPD_INFOFRAME_SIZE25
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 06/12] video/hdmi: Derive the bar data valid bit from the bar data fields

2013-08-19 Thread Damien Lespiau
On Thu, Aug 15, 2013 at 04:45:56PM +0200, Thierry Reding wrote:
> On Wed, Aug 14, 2013 at 06:19:09PM +0100, Damien Lespiau wrote:
> > Just like:
> > 
> >   Author: Damien Lespiau 
> >   Date:   Mon Aug 12 11:53:24 2013 +0100
> > 
> >   video/hdmi: Don't let the user of this API create invalid infoframes
> > 
> > But this time for the horizontal/vertical bar data present bits.
> > 
> > Signed-off-by: Damien Lespiau 
> > Reviewed-by: Ville Syrjälä 
> > ---
> >  drivers/video/hdmi.c | 5 +++--
> >  include/linux/hdmi.h | 2 --
> >  2 files changed, 3 insertions(+), 4 deletions(-)
> 
> Same comments as for patch 5. Although I begin to see some sense in
> this. Perhaps not exposing these boolean fields is a good idea after
> all. I wonder if we're excluding some particular use-case by not
> exposing these fields.

Right, so I included patch 5/6 to the v4 of the series, putting
preventing someone from generating invalid infoframes before the
hypothetical use-case where we want the detail of the fields.

We are, de-facto, excluding the case where we'd want to have _unpack()
variants decoding infoframes, but that would only be useful if we wanted
to check the validity of infoframes in the kernel for instance. I think
it's unlikely we'd like to do that. It's also straightforward to revert
the 2 patches if/when that happens.

-- 
Damien
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


A gentle scrub

2013-08-19 Thread Damien Lespiau
A small pass on drm headers to remove some stale prototypes/functions/defines
and to make static a few functions.

 drivers/gpu/drm/drm_crtc.c  | 38 +++--
 drivers/gpu/drm/drm_fb_cma_helper.c |  5 ++---
 drivers/gpu/drm/drm_modes.c | 21 
 drivers/gpu/drm/drm_platform.c  |  7 +++
 include/drm/drmP.h  |  8 
 include/drm/drm_crtc.h  | 17 -
 include/drm/drm_fb_cma_helper.h |  1 -
 include/drm/drm_pciids.h| 30 -
 8 files changed, 8 insertions(+), 119 deletions(-)

-- 
Damien
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 1/8] drm: Remove stale prototypes

2013-08-19 Thread Damien Lespiau
A few prototypes have been left in the headers, their function friends
long gone.

Signed-off-by: Damien Lespiau 
---
 include/drm/drmP.h |  5 -
 include/drm/drm_crtc.h | 11 ---
 2 files changed, 16 deletions(-)

diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 39911dc..046a7db 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1371,7 +1371,6 @@ extern int drm_irq_uninstall(struct drm_device *dev);
 extern int drm_vblank_init(struct drm_device *dev, int num_crtcs);
 extern int drm_wait_vblank(struct drm_device *dev, void *data,
   struct drm_file *filp);
-extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq);
 extern u32 drm_vblank_count(struct drm_device *dev, int crtc);
 extern u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc,
 struct timeval *vblanktime);
@@ -1491,10 +1490,6 @@ void drm_prime_destroy_file_private(struct 
drm_prime_file_private *prime_fpriv);
 int drm_prime_lookup_buf_handle(struct drm_prime_file_private *prime_fpriv, 
struct dma_buf *dma_buf, uint32_t *handle);
 void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv, 
struct dma_buf *dma_buf);
 
-int drm_prime_add_dma_buf(struct drm_device *dev, struct drm_gem_object *obj);
-int drm_prime_lookup_obj(struct drm_device *dev, struct dma_buf *buf,
-struct drm_gem_object **obj);
-
 #if DRM_DEBUG_CODE
 extern int drm_vma_info(struct seq_file *m, void *data);
 #endif
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 45f1332..eb40a96 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -948,9 +948,6 @@ extern int drm_object_property_set_value(struct 
drm_mode_object *obj,
 extern int drm_object_property_get_value(struct drm_mode_object *obj,
 struct drm_property *property,
 uint64_t *value);
-extern struct drm_display_mode *drm_crtc_mode_create(struct drm_device *dev);
-extern void drm_framebuffer_set_object(struct drm_device *dev,
-  unsigned long handle);
 extern int drm_framebuffer_init(struct drm_device *dev,
struct drm_framebuffer *fb,
const struct drm_framebuffer_funcs *funcs);
@@ -961,10 +958,6 @@ extern void drm_framebuffer_reference(struct 
drm_framebuffer *fb);
 extern void drm_framebuffer_remove(struct drm_framebuffer *fb);
 extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb);
 extern void drm_framebuffer_unregister_private(struct drm_framebuffer *fb);
-extern int drmfb_probe(struct drm_device *dev, struct drm_crtc *crtc);
-extern int drmfb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
-extern void drm_crtc_probe_connector_modes(struct drm_device *dev, int maxX, 
int maxY);
-extern bool drm_crtc_in_use(struct drm_crtc *crtc);
 
 extern void drm_object_attach_property(struct drm_mode_object *obj,
   struct drm_property *property,
@@ -1039,10 +1032,6 @@ extern int drm_mode_getblob_ioctl(struct drm_device *dev,
  void *data, struct drm_file *file_priv);
 extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev,
  void *data, struct drm_file 
*file_priv);
-extern int drm_mode_hotplug_ioctl(struct drm_device *dev,
- void *data, struct drm_file *file_priv);
-extern int drm_mode_replacefb(struct drm_device *dev,
- void *data, struct drm_file *file_priv);
 extern int drm_mode_getencoder(struct drm_device *dev,
   void *data, struct drm_file *file_priv);
 extern int drm_mode_gamma_get_ioctl(struct drm_device *dev,
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 2/8] drm: Remove drm_mode_create_dithering_property()

2013-08-19 Thread Damien Lespiau
This was last used by nouveau, replaced by a driver-specific property
in:

  commit de69185573586302ada2e59ba41835df36986277
  Author: Ben Skeggs 
  Date:   Mon Oct 17 12:23:41 2011 +1000

  drm/nouveau: improve dithering properties, and implement proper auto mode

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_crtc.c | 31 ---
 include/drm/drm_crtc.h |  1 -
 2 files changed, 32 deletions(-)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index a691764..ffb791f 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -125,13 +125,6 @@ static const struct drm_prop_enum_list 
drm_scaling_mode_enum_list[] =
{ DRM_MODE_SCALE_ASPECT, "Full aspect" },
 };
 
-static const struct drm_prop_enum_list drm_dithering_mode_enum_list[] =
-{
-   { DRM_MODE_DITHERING_OFF, "Off" },
-   { DRM_MODE_DITHERING_ON, "On" },
-   { DRM_MODE_DITHERING_AUTO, "Automatic" },
-};
-
 /*
  * Non-global properties, but "required" for certain connectors.
  */
@@ -1161,30 +1154,6 @@ int drm_mode_create_scaling_mode_property(struct 
drm_device *dev)
 EXPORT_SYMBOL(drm_mode_create_scaling_mode_property);
 
 /**
- * drm_mode_create_dithering_property - create dithering property
- * @dev: DRM device
- *
- * Called by a driver the first time it's needed, must be attached to desired
- * connectors.
- */
-int drm_mode_create_dithering_property(struct drm_device *dev)
-{
-   struct drm_property *dithering_mode;
-
-   if (dev->mode_config.dithering_mode_property)
-   return 0;
-
-   dithering_mode =
-   drm_property_create_enum(dev, 0, "dithering",
-   drm_dithering_mode_enum_list,
-   ARRAY_SIZE(drm_dithering_mode_enum_list));
-   dev->mode_config.dithering_mode_property = dithering_mode;
-
-   return 0;
-}
-EXPORT_SYMBOL(drm_mode_create_dithering_property);
-
-/**
  * drm_mode_create_dirty_property - create dirty property
  * @dev: DRM device
  *
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index eb40a96..781988f 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -982,7 +982,6 @@ extern int drm_mode_create_dvi_i_properties(struct 
drm_device *dev);
 extern int drm_mode_create_tv_properties(struct drm_device *dev, int 
num_formats,
 char *formats[]);
 extern int drm_mode_create_scaling_mode_property(struct drm_device *dev);
-extern int drm_mode_create_dithering_property(struct drm_device *dev);
 extern int drm_mode_create_dirty_info_property(struct drm_device *dev);
 extern const char *drm_get_encoder_name(const struct drm_encoder *encoder);
 
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 4/8] drm: Make drm_mode_remove() static

2013-08-19 Thread Damien Lespiau
It's only used in drm_crtc.c.

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_crtc.c | 7 +++
 include/drm/drm_crtc.h | 1 -
 2 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index ffb791f..54b4169 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -686,20 +686,19 @@ void drm_mode_probed_add(struct drm_connector *connector,
 }
 EXPORT_SYMBOL(drm_mode_probed_add);
 
-/**
+/*
  * drm_mode_remove - remove and free a mode
  * @connector: connector list to modify
  * @mode: mode to remove
  *
  * Remove @mode from @connector's mode list, then free it.
  */
-void drm_mode_remove(struct drm_connector *connector,
-struct drm_display_mode *mode)
+static void drm_mode_remove(struct drm_connector *connector,
+   struct drm_display_mode *mode)
 {
list_del(&mode->head);
drm_mode_destroy(connector->dev, mode);
 }
-EXPORT_SYMBOL(drm_mode_remove);
 
 /**
  * drm_connector_init - Init a preallocated connector
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 39d84dc..014e491 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -910,7 +910,6 @@ extern struct edid *drm_get_edid(struct drm_connector 
*connector,
 struct i2c_adapter *adapter);
 extern int drm_add_edid_modes(struct drm_connector *connector, struct edid 
*edid);
 extern void drm_mode_probed_add(struct drm_connector *connector, struct 
drm_display_mode *mode);
-extern void drm_mode_remove(struct drm_connector *connector, struct 
drm_display_mode *mode);
 extern void drm_mode_copy(struct drm_display_mode *dst, const struct 
drm_display_mode *src);
 extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
   const struct 
drm_display_mode *mode);
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 3/8] drm: Remove drm_mode_list_concat()

2013-08-19 Thread Damien Lespiau
The last user was removed in

  commit 575dc34ee0de867ba83abf25998e0963bff451fa
  Author: Dave Airlie 
  Date:   Mon Sep 7 18:43:26 2009 +1000

  drm/kms: remove old std mode fallback code.

  The new code adds modes in the helper, which makes more sense
  I disliked the non-driver code adding modes.

Signed-off-by: Damien Lespiau 
---
 drivers/gpu/drm/drm_modes.c | 21 -
 include/drm/drm_crtc.h  |  2 --
 2 files changed, 23 deletions(-)

diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
index 504a602..fc2adb6 100644
--- a/drivers/gpu/drm/drm_modes.c
+++ b/drivers/gpu/drm/drm_modes.c
@@ -596,27 +596,6 @@ void drm_mode_set_name(struct drm_display_mode *mode)
 EXPORT_SYMBOL(drm_mode_set_name);
 
 /**
- * drm_mode_list_concat - move modes from one list to another
- * @head: source list
- * @new: dst list
- *
- * LOCKING:
- * Caller must ensure both lists are locked.
- *
- * Move all the modes from @head to @new.
- */
-void drm_mode_list_concat(struct list_head *head, struct list_head *new)
-{
-
-   struct list_head *entry, *tmp;
-
-   list_for_each_safe(entry, tmp, head) {
-   list_move_tail(entry, new);
-   }
-}
-EXPORT_SYMBOL(drm_mode_list_concat);
-
-/**
  * drm_mode_width - get the width of a mode
  * @mode: mode
  *
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 781988f..39d84dc 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -927,8 +927,6 @@ extern int drm_mode_height(const struct drm_display_mode 
*mode);
 /* for us by fb module */
 extern struct drm_display_mode *drm_mode_create(struct drm_device *dev);
 extern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode 
*mode);
-extern void drm_mode_list_concat(struct list_head *head,
-struct list_head *new);
 extern void drm_mode_validate_size(struct drm_device *dev,
   struct list_head *mode_list,
   int maxX, int maxY, int maxPitch);
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 5/8] drm: Remove 2 unused defines

2013-08-19 Thread Damien Lespiau
These were introduced in the very first DRM commit:

  commit f453ba0460742ad027ae0c4c7d61e62817b3e7ef
  Author: Dave Airlie 
  Date:   Fri Nov 7 14:05:41 2008 -0800

  DRM: add mode setting support

  Add mode setting support to the DRM layer.

But are unused.

Signed-off-by: Damien Lespiau 
---
 include/drm/drm_crtc.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 014e491..0a9f73e 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -494,8 +494,6 @@ struct drm_encoder_funcs {
void (*destroy)(struct drm_encoder *encoder);
 };
 
-#define DRM_CONNECTOR_MAX_UMODES 16
-#define DRM_CONNECTOR_LEN 32
 #define DRM_CONNECTOR_MAX_ENCODER 3
 
 /**
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


  1   2   3   4   5   6   >