2013-02-22 00:48:37 +01:00
|
|
|
/*
|
|
|
|
* This file is part of the coreboot project.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2012 Google Inc.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; version 2 of the License.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*/
|
|
|
|
|
2014-08-31 22:12:24 +02:00
|
|
|
#include <drivers/intel/gma/i915_reg.h>
|
|
|
|
#include <drivers/intel/gma/drm_dp_helper.h>
|
link/graphics: New state machine
This is a new state machine. It is more programmatic, in the
case of auxio, and has much more symbolic naming, and very few
"magic" numbers, except in the case of undocumented settings.
As before, the 'pre-computed' IO ops are encoded in the iodefs
table. A function, run, is passed and index into the table and
runs the ops.
A new operator, I, has been added. When the I operator is hit,
run() returns the index of the next operator in the table.
The i915lightup function runs the table. All the AUX channel ops
have been removed from the table, however, and are now called as
functions, using the previously committed auxio function.
The iodefs table has been grouped into blocks of ops, which end in
an I operator. As the lightup function progresses through startup,
and the run() returns, the lightup function performs aux channel
operations.
This code is symbolic enough, I hope, that it will make haswell
graphics bringup simpler.
i915io.c, and the core of the code in i915lightup.c, were
programatically generated, starting with IO logs from the DRM
startup code in the kernel. It is possible to apply the tools that
do this generation to newer IO logs from the kernel.
Change-Id: I8a8e121dc0d9674f0c6a866343b28e179a1e3d8a
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Reviewed-on: http://review.coreboot.org/2836
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
2013-03-06 02:07:40 +01:00
|
|
|
|
|
|
|
/* things that are, strangely, not defined anywhere? */
|
|
|
|
#define PCH_PP_UNLOCK 0xabcd0000
|
|
|
|
#define WMx_LP_SR_EN (1<<31)
|
|
|
|
|
|
|
|
/* Google Link-specific defines */
|
|
|
|
/* how many 4096-byte pages do we need for the framebuffer?
|
|
|
|
* There are 32 bits per pixel, or 4 bytes,
|
|
|
|
* which means 1024 pixels per page.
|
|
|
|
* HencetThere are 4250 GTTs on Link:
|
|
|
|
* 2650 (X) * 1700 (Y) pixels / 1024 pixels per page.
|
|
|
|
*/
|
|
|
|
#define FRAME_BUFFER_PAGES ((2560*1700)/1024)
|
|
|
|
#define FRAME_BUFFER_BYTES (FRAME_BUFFER_PAGES*4096)
|
2013-02-22 00:48:37 +01:00
|
|
|
|
|
|
|
/* One-letter commands for code not meant to be ready for humans.
|
|
|
|
* The code was generated by a set of programs/scripts.
|
|
|
|
* M print out a kernel message
|
|
|
|
* R read a register. We do these mainly to ensure that if hardware wanted
|
|
|
|
* the register read, it was read; also, in debug, we can see what was expected
|
|
|
|
* and what was found. This has proven *very* useful to get this debugged.
|
|
|
|
* The udelay, if non-zero, will make sure there is a
|
|
|
|
* udelay() call with the value.
|
|
|
|
* The count is from the kernel and tells us how many times this read was done.
|
|
|
|
* Also useful for debugging and the state
|
|
|
|
* machine uses the info to drive a poll.
|
|
|
|
* W Write a register
|
|
|
|
* V set verbosity. It's a bit mask.
|
|
|
|
* 0 -> nothing
|
|
|
|
* 1 -> print kernel messages
|
|
|
|
* 2 -> print IO ops
|
|
|
|
* 4 -> print the number of times we spin on a register in a poll
|
|
|
|
* 8 -> restore whatever the previous verbosity level was
|
|
|
|
* (only one deep stack)
|
|
|
|
*
|
|
|
|
* Again, this is not really meant for human consumption. There is not a poll
|
|
|
|
* operator as such because, sometimes, there is a read/write/read where the
|
|
|
|
* second read is a poll, and this chipset is so touchy I'm reluctant to move
|
|
|
|
* things around and/or delete too many reads.
|
|
|
|
*/
|
|
|
|
#define M 1
|
|
|
|
#define R 2
|
link/graphics: New state machine
This is a new state machine. It is more programmatic, in the
case of auxio, and has much more symbolic naming, and very few
"magic" numbers, except in the case of undocumented settings.
As before, the 'pre-computed' IO ops are encoded in the iodefs
table. A function, run, is passed and index into the table and
runs the ops.
A new operator, I, has been added. When the I operator is hit,
run() returns the index of the next operator in the table.
The i915lightup function runs the table. All the AUX channel ops
have been removed from the table, however, and are now called as
functions, using the previously committed auxio function.
The iodefs table has been grouped into blocks of ops, which end in
an I operator. As the lightup function progresses through startup,
and the run() returns, the lightup function performs aux channel
operations.
This code is symbolic enough, I hope, that it will make haswell
graphics bringup simpler.
i915io.c, and the core of the code in i915lightup.c, were
programatically generated, starting with IO logs from the DRM
startup code in the kernel. It is possible to apply the tools that
do this generation to newer IO logs from the kernel.
Change-Id: I8a8e121dc0d9674f0c6a866343b28e179a1e3d8a
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Reviewed-on: http://review.coreboot.org/2836
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
2013-03-06 02:07:40 +01:00
|
|
|
#define W 4
|
|
|
|
#define V 8
|
|
|
|
#define I 16
|
|
|
|
#define P 32
|
2013-02-22 00:48:37 +01:00
|
|
|
|
|
|
|
struct iodef {
|
|
|
|
unsigned char op;
|
|
|
|
unsigned int count;
|
|
|
|
const char *msg;
|
|
|
|
unsigned long addr;
|
|
|
|
unsigned long data;
|
|
|
|
unsigned long udelay;
|
|
|
|
};
|
2013-02-27 18:54:47 +01:00
|
|
|
|
|
|
|
/* i915.c */
|
|
|
|
unsigned long io_i915_READ32(unsigned long addr);
|
|
|
|
void io_i915_WRITE32(unsigned long val, unsigned long addr);
|
|
|
|
|
|
|
|
/* intel_dp.c */
|
link/graphics: New state machine
This is a new state machine. It is more programmatic, in the
case of auxio, and has much more symbolic naming, and very few
"magic" numbers, except in the case of undocumented settings.
As before, the 'pre-computed' IO ops are encoded in the iodefs
table. A function, run, is passed and index into the table and
runs the ops.
A new operator, I, has been added. When the I operator is hit,
run() returns the index of the next operator in the table.
The i915lightup function runs the table. All the AUX channel ops
have been removed from the table, however, and are now called as
functions, using the previously committed auxio function.
The iodefs table has been grouped into blocks of ops, which end in
an I operator. As the lightup function progresses through startup,
and the run() returns, the lightup function performs aux channel
operations.
This code is symbolic enough, I hope, that it will make haswell
graphics bringup simpler.
i915io.c, and the core of the code in i915lightup.c, were
programatically generated, starting with IO logs from the DRM
startup code in the kernel. It is possible to apply the tools that
do this generation to newer IO logs from the kernel.
Change-Id: I8a8e121dc0d9674f0c6a866343b28e179a1e3d8a
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Reviewed-on: http://review.coreboot.org/2836
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
2013-03-06 02:07:40 +01:00
|
|
|
u32 pack_aux(u32 *src, int src_bytes);
|
|
|
|
void unpack_aux(u32 src, u32 *dst, int dst_bytes);
|
|
|
|
int intel_dp_aux_ch(u32 ch_ctl, u32 ch_data, u32 *send, int send_bytes,
|
|
|
|
u32 *recv, int recv_size);
|