1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * ddbridge-mci.c: Digital Devices microcode interface
4  *
5  * Copyright (C) 2017 Digital Devices GmbH
6  *                    Ralph Metzler <rjkm@metzlerbros.de>
7  *                    Marcus Metzler <mocm@metzlerbros.de>
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * version 2 only, as published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  */
18 
19 #include "ddbridge.h"
20 #include "ddbridge-io.h"
21 #include "ddbridge-mci.h"
22 
23 static LIST_HEAD(mci_list);
24 
25 static const u32 MCLK = (1550000000 / 12);
26 static const u32 MAX_DEMOD_LDPC_BITRATE = (1550000000 / 6);
27 static const u32 MAX_LDPC_BITRATE = (720000000);
28 
29 struct mci_base {
30 	struct list_head     mci_list;
31 	void                *key;
32 	struct ddb_link     *link;
33 	struct completion    completion;
34 
35 	struct device       *dev;
36 	struct mutex         tuner_lock; /* concurrent tuner access lock */
37 	u8                   adr;
38 	struct mutex         mci_lock; /* concurrent MCI access lock */
39 	int                  count;
40 
41 	u8                   tuner_use_count[4];
42 	u8                   assigned_demod[8];
43 	u32                  used_ldpc_bitrate[8];
44 	u8                   demod_in_use[8];
45 	u32                  iq_mode;
46 };
47 
48 struct mci {
49 	struct mci_base     *base;
50 	struct dvb_frontend  fe;
51 	int                  nr;
52 	int                  demod;
53 	int                  tuner;
54 	int                  first_time_lock;
55 	int                  started;
56 	struct mci_result    signal_info;
57 
58 	u32                  bb_mode;
59 };
60 
61 static int mci_reset(struct mci *state)
62 {
63 	struct ddb_link *link = state->base->link;
64 	u32 status = 0;
65 	u32 timeout = 40;
66 
67 	ddblwritel(link, MCI_CONTROL_RESET, MCI_CONTROL);
68 	ddblwritel(link, 0, MCI_CONTROL + 4); /* 1= no internal init */
69 	msleep(300);
70 	ddblwritel(link, 0, MCI_CONTROL);
71 
72 	while (1) {
73 		status = ddblreadl(link, MCI_CONTROL);
74 		if ((status & MCI_CONTROL_READY) == MCI_CONTROL_READY)
75 			break;
76 		if (--timeout == 0)
77 			break;
78 		msleep(50);
79 	}
80 	if ((status & MCI_CONTROL_READY) == 0)
81 		return -1;
82 	if (link->ids.device == 0x0009)
83 		ddblwritel(link, SX8_TSCONFIG_MODE_NORMAL, SX8_TSCONFIG);
84 	return 0;
85 }
86 
87 static int mci_config(struct mci *state, u32 config)
88 {
89 	struct ddb_link *link = state->base->link;
90 
91 	if (link->ids.device != 0x0009)
92 		return -EINVAL;
93 	ddblwritel(link, config, SX8_TSCONFIG);
94 	return 0;
95 }
96 
97 static int _mci_cmd_unlocked(struct mci *state,
98 			     u32 *cmd, u32 cmd_len,
99 			     u32 *res, u32 res_len)
100 {
101 	struct ddb_link *link = state->base->link;
102 	u32 i, val;
103 	unsigned long stat;
104 
105 	val = ddblreadl(link, MCI_CONTROL);
106 	if (val & (MCI_CONTROL_RESET | MCI_CONTROL_START_COMMAND))
107 		return -EIO;
108 	if (cmd && cmd_len)
109 		for (i = 0; i < cmd_len; i++)
110 			ddblwritel(link, cmd[i], MCI_COMMAND + i * 4);
111 	val |= (MCI_CONTROL_START_COMMAND | MCI_CONTROL_ENABLE_DONE_INTERRUPT);
112 	ddblwritel(link, val, MCI_CONTROL);
113 
114 	stat = wait_for_completion_timeout(&state->base->completion, HZ);
115 	if (stat == 0) {
116 		dev_warn(state->base->dev, "MCI-%d: MCI timeout\n", state->nr);
117 		return -EIO;
118 	}
119 	if (res && res_len)
120 		for (i = 0; i < res_len; i++)
121 			res[i] = ddblreadl(link, MCI_RESULT + i * 4);
122 	return 0;
123 }
124 
125 static int mci_cmd(struct mci *state,
126 		   struct mci_command *command,
127 		   struct mci_result *result)
128 {
129 	int stat;
130 
131 	mutex_lock(&state->base->mci_lock);
132 	stat = _mci_cmd_unlocked(state,
133 				 (u32 *)command, sizeof(*command) / sizeof(u32),
134 				 (u32 *)result, sizeof(*result) / sizeof(u32));
135 	mutex_unlock(&state->base->mci_lock);
136 	return stat;
137 }
138 
139 static void mci_handler(void *priv)
140 {
141 	struct mci_base *base = (struct mci_base *)priv;
142 
143 	complete(&base->completion);
144 }
145 
146 static void release(struct dvb_frontend *fe)
147 {
148 	struct mci *state = fe->demodulator_priv;
149 
150 	state->base->count--;
151 	if (state->base->count == 0) {
152 		list_del(&state->base->mci_list);
153 		kfree(state->base);
154 	}
155 	kfree(state);
156 }
157 
158 static int read_status(struct dvb_frontend *fe, enum fe_status *status)
159 {
160 	int stat;
161 	struct mci *state = fe->demodulator_priv;
162 	struct mci_command cmd;
163 	struct mci_result res;
164 
165 	cmd.command = MCI_CMD_GETSTATUS;
166 	cmd.demod = state->demod;
167 	stat = mci_cmd(state, &cmd, &res);
168 	if (stat)
169 		return stat;
170 	*status = 0x00;
171 	if (res.status == SX8_DEMOD_WAIT_MATYPE)
172 		*status = 0x0f;
173 	if (res.status == SX8_DEMOD_LOCKED)
174 		*status = 0x1f;
175 	return stat;
176 }
177 
178 static int mci_set_tuner(struct dvb_frontend *fe, u32 tuner, u32 on)
179 {
180 	struct mci *state = fe->demodulator_priv;
181 	struct mci_command cmd;
182 
183 	memset(&cmd, 0, sizeof(cmd));
184 	cmd.tuner = state->tuner;
185 	cmd.command = on ? SX8_CMD_INPUT_ENABLE : SX8_CMD_INPUT_DISABLE;
186 	return mci_cmd(state, &cmd, NULL);
187 }
188 
189 static int stop(struct dvb_frontend *fe)
190 {
191 	struct mci *state = fe->demodulator_priv;
192 	struct mci_command cmd;
193 	u32 input = state->tuner;
194 
195 	memset(&cmd, 0, sizeof(cmd));
196 	if (state->demod != 0xff) {
197 		cmd.command = MCI_CMD_STOP;
198 		cmd.demod = state->demod;
199 		mci_cmd(state, &cmd, NULL);
200 		if (state->base->iq_mode) {
201 			cmd.command = MCI_CMD_STOP;
202 			cmd.demod = state->demod;
203 			cmd.output = 0;
204 			mci_cmd(state, &cmd, NULL);
205 			mci_config(state, SX8_TSCONFIG_MODE_NORMAL);
206 		}
207 	}
208 	mutex_lock(&state->base->tuner_lock);
209 	state->base->tuner_use_count[input]--;
210 	if (!state->base->tuner_use_count[input])
211 		mci_set_tuner(fe, input, 0);
212 	state->base->demod_in_use[state->demod] = 0;
213 	state->base->used_ldpc_bitrate[state->nr] = 0;
214 	state->demod = 0xff;
215 	state->base->assigned_demod[state->nr] = 0xff;
216 	state->base->iq_mode = 0;
217 	mutex_unlock(&state->base->tuner_lock);
218 	state->started = 0;
219 	return 0;
220 }
221 
222 static int start(struct dvb_frontend *fe, u32 flags, u32 modmask, u32 ts_config)
223 {
224 	struct mci *state = fe->demodulator_priv;
225 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
226 	u32 used_ldpc_bitrate = 0, free_ldpc_bitrate;
227 	u32 used_demods = 0;
228 	struct mci_command cmd;
229 	u32 input = state->tuner;
230 	u32 bits_per_symbol = 0;
231 	int i, stat = 0;
232 
233 	if (p->symbol_rate >= (MCLK / 2))
234 		flags &= ~1;
235 	if ((flags & 3) == 0)
236 		return -EINVAL;
237 
238 	if (flags & 2) {
239 		u32 tmp = modmask;
240 
241 		bits_per_symbol = 1;
242 		while (tmp & 1) {
243 			tmp >>= 1;
244 			bits_per_symbol++;
245 		}
246 	}
247 
248 	mutex_lock(&state->base->tuner_lock);
249 	if (state->base->iq_mode) {
250 		stat = -EBUSY;
251 		goto unlock;
252 	}
253 	for (i = 0; i < 8; i++) {
254 		used_ldpc_bitrate += state->base->used_ldpc_bitrate[i];
255 		if (state->base->demod_in_use[i])
256 			used_demods++;
257 	}
258 	if (used_ldpc_bitrate >= MAX_LDPC_BITRATE ||
259 	    ((ts_config & SX8_TSCONFIG_MODE_MASK) >
260 	     SX8_TSCONFIG_MODE_NORMAL && used_demods > 0)) {
261 		stat = -EBUSY;
262 		goto unlock;
263 	}
264 	free_ldpc_bitrate = MAX_LDPC_BITRATE - used_ldpc_bitrate;
265 	if (free_ldpc_bitrate > MAX_DEMOD_LDPC_BITRATE)
266 		free_ldpc_bitrate = MAX_DEMOD_LDPC_BITRATE;
267 
268 	while (p->symbol_rate * bits_per_symbol > free_ldpc_bitrate)
269 		bits_per_symbol--;
270 
271 	if (bits_per_symbol < 2) {
272 		stat = -EBUSY;
273 		goto unlock;
274 	}
275 	i = (p->symbol_rate > (MCLK / 2)) ? 3 : 7;
276 	while (i >= 0 && state->base->demod_in_use[i])
277 		i--;
278 	if (i < 0) {
279 		stat = -EBUSY;
280 		goto unlock;
281 	}
282 	state->base->demod_in_use[i] = 1;
283 	state->base->used_ldpc_bitrate[state->nr] = p->symbol_rate
284 						    * bits_per_symbol;
285 	state->demod = i;
286 	state->base->assigned_demod[state->nr] = i;
287 
288 	if (!state->base->tuner_use_count[input])
289 		mci_set_tuner(fe, input, 1);
290 	state->base->tuner_use_count[input]++;
291 	state->base->iq_mode = (ts_config > 1);
292 unlock:
293 	mutex_unlock(&state->base->tuner_lock);
294 	if (stat)
295 		return stat;
296 	memset(&cmd, 0, sizeof(cmd));
297 
298 	if (state->base->iq_mode) {
299 		cmd.command = SX8_CMD_SELECT_IQOUT;
300 		cmd.demod = state->demod;
301 		cmd.output = 0;
302 		mci_cmd(state, &cmd, NULL);
303 		mci_config(state, ts_config);
304 	}
305 	if (p->stream_id != NO_STREAM_ID_FILTER && p->stream_id != 0x80000000)
306 		flags |= 0x80;
307 	dev_dbg(state->base->dev, "MCI-%d: tuner=%d demod=%d\n",
308 		state->nr, state->tuner, state->demod);
309 	cmd.command = MCI_CMD_SEARCH_DVBS;
310 	cmd.dvbs2_search.flags = flags;
311 	cmd.dvbs2_search.s2_modulation_mask =
312 		modmask & ((1 << (bits_per_symbol - 1)) - 1);
313 	cmd.dvbs2_search.retry = 2;
314 	cmd.dvbs2_search.frequency = p->frequency * 1000;
315 	cmd.dvbs2_search.symbol_rate = p->symbol_rate;
316 	cmd.dvbs2_search.scrambling_sequence_index =
317 		p->scrambling_sequence_index;
318 	cmd.dvbs2_search.input_stream_id =
319 		(p->stream_id != NO_STREAM_ID_FILTER) ? p->stream_id : 0;
320 	cmd.tuner = state->tuner;
321 	cmd.demod = state->demod;
322 	cmd.output = state->nr;
323 	if (p->stream_id == 0x80000000)
324 		cmd.output |= 0x80;
325 	stat = mci_cmd(state, &cmd, NULL);
326 	if (stat)
327 		stop(fe);
328 	return stat;
329 }
330 
331 static int start_iq(struct dvb_frontend *fe, u32 ts_config)
332 {
333 	struct mci *state = fe->demodulator_priv;
334 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
335 	u32 used_demods = 0;
336 	struct mci_command cmd;
337 	u32 input = state->tuner;
338 	int i, stat = 0;
339 
340 	mutex_lock(&state->base->tuner_lock);
341 	if (state->base->iq_mode) {
342 		stat = -EBUSY;
343 		goto unlock;
344 	}
345 	for (i = 0; i < 8; i++)
346 		if (state->base->demod_in_use[i])
347 			used_demods++;
348 	if (used_demods > 0) {
349 		stat = -EBUSY;
350 		goto unlock;
351 	}
352 	state->demod = 0;
353 	state->base->assigned_demod[state->nr] = 0;
354 	if (!state->base->tuner_use_count[input])
355 		mci_set_tuner(fe, input, 1);
356 	state->base->tuner_use_count[input]++;
357 	state->base->iq_mode = (ts_config > 1);
358 unlock:
359 	mutex_unlock(&state->base->tuner_lock);
360 	if (stat)
361 		return stat;
362 
363 	memset(&cmd, 0, sizeof(cmd));
364 	cmd.command = SX8_CMD_START_IQ;
365 	cmd.dvbs2_search.frequency = p->frequency * 1000;
366 	cmd.dvbs2_search.symbol_rate = p->symbol_rate;
367 	cmd.tuner = state->tuner;
368 	cmd.demod = state->demod;
369 	cmd.output = 7;
370 	mci_config(state, ts_config);
371 	stat = mci_cmd(state, &cmd, NULL);
372 	if (stat)
373 		stop(fe);
374 	return stat;
375 }
376 
377 static int set_parameters(struct dvb_frontend *fe)
378 {
379 	int stat = 0;
380 	struct mci *state = fe->demodulator_priv;
381 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
382 	u32 ts_config, iq_mode = 0, isi;
383 
384 	if (state->started)
385 		stop(fe);
386 
387 	isi = p->stream_id;
388 	if (isi != NO_STREAM_ID_FILTER)
389 		iq_mode = (isi & 0x30000000) >> 28;
390 
391 	switch (iq_mode) {
392 	case 1:
393 		ts_config = (SX8_TSCONFIG_TSHEADER | SX8_TSCONFIG_MODE_IQ);
394 		break;
395 	case 2:
396 		ts_config = (SX8_TSCONFIG_TSHEADER | SX8_TSCONFIG_MODE_IQ);
397 		break;
398 	default:
399 		ts_config = SX8_TSCONFIG_MODE_NORMAL;
400 		break;
401 	}
402 
403 	if (iq_mode != 2) {
404 		u32 flags = 3;
405 		u32 mask = 3;
406 
407 		if (p->modulation == APSK_16 ||
408 		    p->modulation == APSK_32) {
409 			flags = 2;
410 			mask = 15;
411 		}
412 		stat = start(fe, flags, mask, ts_config);
413 	} else {
414 		stat = start_iq(fe, ts_config);
415 	}
416 
417 	if (!stat) {
418 		state->started = 1;
419 		state->first_time_lock = 1;
420 		state->signal_info.status = SX8_DEMOD_WAIT_SIGNAL;
421 	}
422 
423 	return stat;
424 }
425 
426 static int tune(struct dvb_frontend *fe, bool re_tune,
427 		unsigned int mode_flags,
428 		unsigned int *delay, enum fe_status *status)
429 {
430 	int r;
431 
432 	if (re_tune) {
433 		r = set_parameters(fe);
434 		if (r)
435 			return r;
436 	}
437 	r = read_status(fe, status);
438 	if (r)
439 		return r;
440 
441 	if (*status & FE_HAS_LOCK)
442 		return 0;
443 	*delay = HZ / 10;
444 	return 0;
445 }
446 
447 static enum dvbfe_algo get_algo(struct dvb_frontend *fe)
448 {
449 	return DVBFE_ALGO_HW;
450 }
451 
452 static int set_input(struct dvb_frontend *fe, int input)
453 {
454 	struct mci *state = fe->demodulator_priv;
455 
456 	state->tuner = input;
457 	dev_dbg(state->base->dev, "MCI-%d: input=%d\n", state->nr, input);
458 	return 0;
459 }
460 
461 static struct dvb_frontend_ops mci_ops = {
462 	.delsys = { SYS_DVBS, SYS_DVBS2 },
463 	.info = {
464 		.name			= "Digital Devices MaxSX8 MCI DVB-S/S2/S2X",
465 		.frequency_min		= 950000,
466 		.frequency_max		= 2150000,
467 		.frequency_stepsize	= 0,
468 		.frequency_tolerance	= 0,
469 		.symbol_rate_min	= 100000,
470 		.symbol_rate_max	= 100000000,
471 		.caps			= FE_CAN_INVERSION_AUTO |
472 					  FE_CAN_FEC_AUTO       |
473 					  FE_CAN_QPSK           |
474 					  FE_CAN_2G_MODULATION  |
475 					  FE_CAN_MULTISTREAM,
476 	},
477 	.get_frontend_algo		= get_algo,
478 	.tune				= tune,
479 	.release			= release,
480 	.read_status			= read_status,
481 };
482 
483 static struct mci_base *match_base(void *key)
484 {
485 	struct mci_base *p;
486 
487 	list_for_each_entry(p, &mci_list, mci_list)
488 		if (p->key == key)
489 			return p;
490 	return NULL;
491 }
492 
493 static int probe(struct mci *state)
494 {
495 	mci_reset(state);
496 	return 0;
497 }
498 
499 struct dvb_frontend
500 *ddb_mci_attach(struct ddb_input *input,
501 		int mci_type, int nr,
502 		int (**fn_set_input)(struct dvb_frontend *, int))
503 {
504 	struct ddb_port *port = input->port;
505 	struct ddb *dev = port->dev;
506 	struct ddb_link *link = &dev->link[port->lnr];
507 	struct mci_base *base;
508 	struct mci *state;
509 	void *key = mci_type ? (void *)port : (void *)link;
510 
511 	state = kzalloc(sizeof(*state), GFP_KERNEL);
512 	if (!state)
513 		return NULL;
514 
515 	base = match_base(key);
516 	if (base) {
517 		base->count++;
518 		state->base = base;
519 	} else {
520 		base = kzalloc(sizeof(*base), GFP_KERNEL);
521 		if (!base)
522 			goto fail;
523 		base->key = key;
524 		base->count = 1;
525 		base->link = link;
526 		base->dev = dev->dev;
527 		mutex_init(&base->mci_lock);
528 		mutex_init(&base->tuner_lock);
529 		ddb_irq_set(dev, link->nr, 0, mci_handler, base);
530 		init_completion(&base->completion);
531 		state->base = base;
532 		if (probe(state) < 0) {
533 			kfree(base);
534 			goto fail;
535 		}
536 		list_add(&base->mci_list, &mci_list);
537 	}
538 	state->fe.ops = mci_ops;
539 	state->fe.demodulator_priv = state;
540 	state->nr = nr;
541 	*fn_set_input = set_input;
542 
543 	state->tuner = nr;
544 	state->demod = nr;
545 
546 	return &state->fe;
547 fail:
548 	kfree(state);
549 	return NULL;
550 }
551